【分享】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");
}
楼主又开始分享了 不错不错 支持 支持一下! 感谢露珠分享 (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;} 谢谢楼主分享! 本帖最后由 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: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);}
}
支持一下楼主的辛勤工作。 这个可以精华啦。 对了 楼主能做个PDF吗?这样就方便收藏了。 (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
移位与反 或{:lol:}{:lol:} sblpp 发表于 2014-9-3 09:32
对了 楼主能做个PDF吗?这样就方便收藏了。
那我直接转成PDF吧
要费点时间 楼主可以讲讲始终那块的寄存器配置哈,{:lol:}{:lol:} cn_x 发表于 2014-9-3 09:34
那我直接转成PDF吧
要费点时间
感谢楼主{:2_31:}
顶一个先。 楼主,有EEPROM和DAC的吗?求分享!! 收藏,待用! sblpp 发表于 2014-9-3 09:32
对了 楼主能做个PDF吗?这样就方便收藏了。
已全部转为PDF
重新开贴:
http://www.amobbs.com/forum.php?mod=viewthread&tid=5594342&page=1#pid7836694 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的
支持一下 cn_x 发表于 2014-9-3 10:20
EEROM下面链接有
http://www.amobbs.com/forum.php?mod=viewthread&tid=5594342&page=1#pid7836694
DAC可 ...
多谢楼主!! 楼主辛苦了 谢谢 {:handshake:} 收下 飞思官网上的例程sample code好像就是寄存器的吧 顶 寄存器配置可以更了解底层 楼主飞币不少了啊,什么节奏 你们都在努力,我有什么不努力的理由呢 接触一个新的单片机一般先寄存器直接操作,然后再用库文件,谢谢了! 寄存器的操作其实最简单明了,但需要花不少的时间读手册。关键飞思的中文资料太少,菜鸟勿近啊。 还是喜欢直接写寄存器的感觉,不用担心效率,不用担心中途会出错,很直接。
页:
[1]