cn_x 发表于 2014-9-3 09:12:15

【分享】K60寄存器操作实例——转帖

本帖最后由 cn_x 于 2014-9-3 10:04 编辑


此贴会将所有实例陆续放出敬请期待注:查看代码请点下一页提示:已经把所有模块转成PDF文档,链接地址:http://www.amobbs.com/thread-5594342-1-1.html
一、kinetis初体验之GPIO寄存器http://images.cnitblog.com/blog/535878/201306/07155408-50ff6c1fa73746c9962a98ed9f441506.jpg寄存器功能http://images.cnitblog.com/blog/535878/201306/07155449-e746ab1de1a84e6882664d830e7eee8b.jpgI0口初始化http://images.cnitblog.com/blog/535878/201306/07155523-83c6ffcfe68e40b99c1fbd68a75388b7.jpgPORT寄存器一个简单的流水灯
#include "common.h"


#define LED1(a) if(a)\
                   GPIOA_PDOR &= ~(1<<10);\
               else\
                   GPIOA_PDOR |= (1<<10)   


                  
#define LED2(a) if(a)\
                   GPIOA_PDOR &= ~(1<<11);\
               else\
                   GPIOA_PDOR |= (1<<11)      
#define LED3(a) if(a)\
                   GPIOA_PDOR &= ~(1<<28);\
               else\
                   GPIOA_PDOR |= (1<<28)
                  
#define LED4(a) if(a)\
                   GPIOA_PDOR &= ~(1<<29);\
               else\
                   GPIOA_PDOR |= (1<<29)   
                     
void init_gpio(void);
void delay(long count);




void main (void)
{
init_gpio();

LED2(0);
LED3(0);

while(1)
{
    LED4(0);   //灭
    LED1(1);   //亮
    delay(3000000);
    LED2(1);
    LED1(0);
    delay(3000000);
    LED3(1);
    LED2(0);
    delay(3000000);
    LED3(0);
    LED4(1);
    delay(3000000);
}
}


void init_gpio()
{


PORTA_PCR10 &= ~0x700;    //MUX 000
PORTA_PCR10 |= PORT_PCR_MUX(1);   //MUX 001 GPIO模式
PORTA_PCR11 &= ~0x700;
PORTA_PCR11 |= PORT_PCR_MUX(1);
PORTA_PCR28 &= ~0x700;
PORTA_PCR28 |= PORT_PCR_MUX(1);
PORTA_PCR29 &= ~0x700;
PORTA_PCR29 |= PORT_PCR_MUX(1);

GPIOA_PDDR |= ((1<<10)|(1<<11)|(1<<28)|(1<<29));//设置为输出
}


void delay(long count)
{
while(count--)
      asm("nop");
}



abszy 发表于 2014-9-3 09:12:45

楼主又开始分享了   不错不错 支持

wangpengcheng 发表于 2014-9-3 09:14:26

支持一下!   

浪里白条 发表于 2014-9-3 09:15:39

感谢露珠分享

cn_x 发表于 2014-9-3 09:16:38

(kinetis K60)UART寄存器 串口收发数据

http://images.cnitblog.com/blog/535878/201306/07155919-c6079885976840b78ce8c9d09af2e066.jpg串口初始化……#include "common.h"#include "uart.h"#include "isr.h"
void UART4_Init(U32);                     void delay(long count);void Uart4_SendByte(U8 Char);

void main (void){char str[]="hello cortex-m4";U8 i;DisableInterrupts;UART4_Init(57600);EnableInterrupts;while(1){    for(i=0; str!='\0'; i++)      Uart4_SendByte(str);    delay(7000000);}}
void delay(long count){while(count--)      asm("nop");}
void UART4_Init(U32 BaudRate){U16 ubd, brfa;
U8 temp;    PORTC_PCR15 = PORT_PCR_MUX(0x3);   //引脚使能PORTC_PCR14 = PORT_PCR_MUX(0x3); SIM_SCGC1 |= SIM_SCGC1_UART4_MASK;   //时钟使能

UART4_C2 &= ~((1<<2) | (1<<3)); //禁止发送接收   控制寄存器C2UART4_C1 = 0;//控制器C1 全部使用默认配备
ubd = (U16)((50000000)/(BaudRate * 16));   //波特率设置
UART4_BDH = (U8)ubd>>8;UART4_BDL = (U8)(ubd);brfa = (((50000000)/(BaudRate * 16)) - (ubd * 32));//波特率微调 1/32的增量
temp = UART4_C4 & ~(UART_C4_BRFA(0x1F)); UART4_C4 = temp | UART_C4_BRFA(brfa);
UART4_C2 |= ((1<<2) | (1<<3));//允许发送接收
return;}
void Uart4_SendByte(U8 Char){
    while(!(UART_S1_REG(UART4_BASE_PTR) & UART_S1_TDRE_MASK)); //UARTx_S1状态寄存器    UART4_D = Char;    return;}

FSL_TICS_ZP 发表于 2014-9-3 09:18:27

谢谢楼主分享!

cn_x 发表于 2014-9-3 09:19:49

本帖最后由 cn_x 于 2014-9-3 09:21 编辑

(Kinetis K60)外部引脚中断
PA12引脚中断初始化。void Exit_Init(void)
{
SIM_SCGC5 |= (1<<9);      //开启PORTA端口

PORTA_PCR12 |= (1<<8) | (10<<16) | (3);//GPIO 下降沿触发 上拉电阻
GPIOA_PDDR &= ~(1<<12);         //输入模式
enable_irq(87);   //使能PORT中断
}


SIM_SCGC5 使能PORTAhttp://images.cnitblog.com/blog/535878/201306/07160951-2fc15fbed1b0462ba4272416adf0e28e.jpgPORTA_PCR12下降沿触发(1010)http://images.cnitblog.com/blog/535878/201306/07161040-70e6a2e2b3924e7e91584d02b3559023.x-png使能上拉输出http://images.cnitblog.com/blog/535878/201306/07161111-5c34fedc2f204c0085ab0280157c5b7a.jpgPORTA的中断号http://images.cnitblog.com/blog/535878/201306/07161209-1bea1db18fb44c6c8c0608f4e4d53378.jpg重定义中断服务函数http://images.cnitblog.com/blog/535878/201306/07161138-b386b156583d4011bd1466294943912b.x-png中断服务函数#include "common.h"
#include "isr.h"


char str[] = "EXIT";
U8 i;


void PORTA_IRQHandler(void)
{


    if(PORTA_ISFR & (1<<12))             //PTA12触发中断
    {
      PORTA_ISFR|= (1<<12);          //写1清中断标志位
      for(i=0; str!='\0'; i++)
            Uart4_SendByte(str);      
    }
}

PORTA_ISFR寄存器http://images.cnitblog.com/blog/535878/201306/07161346-5d42343216254cd1a1594a94aeb25e8f.jpg
程序运行……
http://images.cnitblog.com/blog/535878/201306/07161424-0c2daea50faa4427917390a913ab7c6e.x-png

cn_x 发表于 2014-9-3 09:26:45

本帖最后由 cn_x 于 2014-9-3 09:29 编辑

(Kinetis K60) AD采集#include "uart4.h"

void UART4_Init(U32 BaudRate)
{
U16 ubd, brfa;

U8 temp;

PORTC_PCR15 = PORT_PCR_MUX(0x3);   //引脚使能
PORTC_PCR14 = PORT_PCR_MUX(0x3);
SIM_SCGC1 |= SIM_SCGC1_UART4_MASK;   //时钟使能


UART4_C2 &= ~((1<<2) | (1<<3)); //禁止发送接收   控制寄存器C2

UART4_C1 = 0;//控制器C1 全部使用默认配备

ubd = (U16)((PERIPH_SYS_CLK)/(BaudRate * 16));   //波特率设置

UART4_BDH = (U8)ubd>>8;
UART4_BDL = (U8)(ubd);


brfa = (((PERIPH_SYS_CLK*32)/(BaudRate * 16)) - (ubd * 32));//波特率微调 1/32的增量

temp = UART4_C4 & ~(UART_C4_BRFA(0x1F));
UART4_C4 = temp | UART_C4_BRFA(brfa);


UART4_C2 |= ((1<<2) | (1<<3));//允许发送接收

return;
}

void Uart4_SendByte(U8 Char)
{

    while(!(UART_S1_REG(UART4_BASE_PTR) & UART_S1_TDRE_MASK)); //UARTx_S1状态寄存器
    UART4_D = Char;
    return;
}

U8 Uart4_Receive(void)
{
    U8 Receivechar;
    while(!(UART_S1_REG(UART4_BASE_PTR) & UART_S1_RDRF_MASK));       //查询是否接受到数据
    Receivechar=   UART4_D;                  //接受到8位的数据
    return(Receivechar);
}
UART4.h
#include "project.h"extern void UART4_Init(U32);extern void Uart4_SendByte(U8);extern U8 Uart4_Receive(void);

创建project.h文件包含需要的头文件和宏定义#include "common.h"

#include "uart.h"//#include "LED.h"
#ifndef EnableInterrupts#define EnableInterrupts asm(" CPSIE i");//开总中断#endif
#ifndef DisableInterrupts#define DisableInterrupts asm(" CPSID i");//关总中断#endif
typedef unsigned short    U16;typedef unsigned long   U32;typedef unsigned char   U8;
例子的AD端口(PRA8)http://images.cnitblog.com/blog/535878/201306/07161957-40830bdb9f234415a0b4b98abc9854bf.x-pngAD初始化函数void ADC0_init(void){
SIM_SCGC6 |= (1<<27);
ADC0_CFG1 |= (1<<5) //ADIV            |(1<<4)         // ADLSMP 1            |(3<<2);   // MODE11
ADC0_CFG1 &= ~((1<<6) | (3)); //ADIV 01ADICLK 00
ADC0_CFG2 |= (1<<2);      // ADHSC   1
ADC0_CFG2 &= ~(3);//ADLSTS 00
ADC0_SC2 &= ~(3);         // REFSEL00 电压源选择
ADC0_SC3 |= ((2)             // AVGS         | (1<<2));            // AVGE 1 使能平均
ADC0_SC3 &= ~(1);         // AVGS 10 16次采样平均

}涉及的寄存器……http://images.cnitblog.com/blog/535878/201306/07162219-c4b3852b417a4bbd98cc1ec3105484c7.jpghttp://images.cnitblog.com/blog/535878/201306/07162227-ea8434a3530740abb2ba18c6cbf3968b.jpghttp://images.cnitblog.com/blog/535878/201306/07162233-f24b8b5265494da6b5d12f10b2f5c7b7.jpghttp://images.cnitblog.com/blog/535878/201306/07162238-569915fd988246b48ec2769bf564485d.jpghttp://images.cnitblog.com/blog/535878/201306/07162243-820220d0ad27472cb5749e6db4a4ce7f.jpgAD采集函数U16 ADC0_SE11_GETDATA(void){
U16 ADResult = 0;
ADC0_SC1A &= ~((1<<5) | (1<<6)); //DIDF 0ALEN 0
ADC0_SC1A &= ~((1<<2) | (1<<4));//设置AD通道AD11(PRA8)ADC0_SC1A |= ((1<<3) | (3));
while (!(ADC0_SC1A>>7));
ADResult = ADC0_RA;
return(ADResult);
}涉及的寄存器……http://images.cnitblog.com/blog/535878/201306/07162405-ae731c793fbf45c28931b87781253f32.jpghttp://images.cnitblog.com/blog/535878/201306/07162413-fea0bc10f8a2482da16b443c85637ce5.jpg主函数void main(void){
U8 ADC8;U16 ADValue;
DisableInterrupts;
UART4_Init(115200);
ADC0_init();   //ADC0初始化
EnableInterrupts;

while(1){
    ADValue = ADC0_SE11_GETDATA();    ADC8 = ADValue;    Uart4_SendByte(ADValue>>8);    Uart4_SendByte(ADC8);    delay(10000000);}

}





wycox 发表于 2014-9-3 09:27:24

支持一下楼主的辛勤工作。

sblpp 发表于 2014-9-3 09:31:58

这个可以精华啦。

sblpp 发表于 2014-9-3 09:32:47

对了 楼主能做个PDF吗?这样就方便收藏了。

cn_x 发表于 2014-9-3 09:33:21

(Kinetis K60) PIT定时中断PIT_LDVALn寄存器的值为计数的值。当计数递减为0时,进入中断服务函数,而计数递减的周期是通过kinetis的BUS时钟分频……http://images.cnitblog.com/blog/535878/201306/07162955-d273697ac06e426a99e5d2ad3cfaa378.jpgPIT的时钟源是总线时钟。总线时钟是由MCGOUTCLK 经OUTDIV2分频得到。(内核时钟是经OUTDIV1分频得到)SIM_CLKDIV1 &= ~(7<<25);

SIM_CLKDIV1 |= (1<<24);
http://images.cnitblog.com/blog/535878/201306/07163047-766963b5e0af4d9697c99563024c8618.jpg
初始化 PIT0定时void PIT0_Init(void){    SIM_SCGC6 |= (1<<23);    PIT_MCR = 0;    PIT_LDVAL0 =50000000;    PIT_TCTRL0 |= (3);     enable_irq(68);
}isr.h文件 重定义 中断服务函数#include "project.h"#undefVECTOR_084#define VECTOR_084    PIT0_IRQHandler   
extern void PIT0_IRQHandler(void);isr.C文件 编写中断服务函数#include "isr.h"char str[]="PIT0 1000ms ";U8 i;void PIT0_IRQHandler(void){for(i=0;str!='\0';i++)    Uart4_SendByte(str);PIT_TFLG0 |= PIT_TFLG_TIF_MASK;   //清中断标志PIT_MCR = 0;   
}程序运行……http://images.cnitblog.com/blog/535878/201306/07163316-19ac3cf2ae844c9196831ac6b52d53b3.x-png


湛泸骏驰 发表于 2014-9-3 09:34:02

移位与反 或{:lol:}{:lol:}

cn_x 发表于 2014-9-3 09:34:36

sblpp 发表于 2014-9-3 09:32
对了 楼主能做个PDF吗?这样就方便收藏了。

那我直接转成PDF吧
要费点时间

湛泸骏驰 发表于 2014-9-3 09:34:51

楼主可以讲讲始终那块的寄存器配置哈,{:lol:}{:lol:}

sblpp 发表于 2014-9-3 09:36:32

cn_x 发表于 2014-9-3 09:34
那我直接转成PDF吧
要费点时间

感谢楼主{:2_31:}
顶一个先。

sdlibin007 发表于 2014-9-3 09:40:21

楼主,有EEPROM和DAC的吗?求分享!!

fengyunyu 发表于 2014-9-3 10:05:01

收藏,待用!

cn_x 发表于 2014-9-3 10:18:40

sblpp 发表于 2014-9-3 09:32
对了 楼主能做个PDF吗?这样就方便收藏了。

已全部转为PDF
重新开贴:
http://www.amobbs.com/forum.php?mod=viewthread&tid=5594342&page=1#pid7836694

cn_x 发表于 2014-9-3 10:20:49

sdlibin007 发表于 2014-9-3 09:40
楼主,有EEPROM和DAC的吗?求分享!!

EEROM下面链接有
http://www.amobbs.com/forum.php?mod=viewthread&tid=5594342&page=1#pid7836694
DAC可以看K70的实例
http://www.amobbs.com/thread-5593775-1-1.html
帖子里的K70实例大全:有DAC的

lzscan 发表于 2014-9-3 10:28:46

支持一下

sdlibin007 发表于 2014-9-3 11:03:29

cn_x 发表于 2014-9-3 10:20
EEROM下面链接有
http://www.amobbs.com/forum.php?mod=viewthread&tid=5594342&page=1#pid7836694
DAC可 ...

多谢楼主!!

WEIZ666 发表于 2014-9-3 11:09:53

楼主辛苦了      谢谢 {:handshake:}         收下

yzb1019 发表于 2014-9-3 12:18:20

飞思官网上的例程sample code好像就是寄存器的吧

dengterry 发表于 2014-9-3 13:14:06

顶 寄存器配置可以更了解底层

bluestone2012 发表于 2014-9-3 13:21:07

楼主飞币不少了啊,什么节奏

rockyyangyang 发表于 2014-9-3 21:20:58

你们都在努力,我有什么不努力的理由呢   

zhaotyue 发表于 2014-9-18 08:49:00

接触一个新的单片机一般先寄存器直接操作,然后再用库文件,谢谢了!

himd 发表于 2014-9-22 20:53:59

寄存器的操作其实最简单明了,但需要花不少的时间读手册。关键飞思的中文资料太少,菜鸟勿近啊。

xjmlfm1 发表于 2014-9-23 11:30:23

还是喜欢直接写寄存器的感觉,不用担心效率,不用担心中途会出错,很直接。
页: [1]
查看完整版本: 【分享】K60寄存器操作实例——转帖