搜索
bottom↓
回复: 29

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

[复制链接]

出0入0汤圆

发表于 2014-9-3 09:12:15 | 显示全部楼层 |阅读模式
本帖最后由 cn_x 于 2014-9-3 10:04 编辑


此贴会将所有实例陆续放出敬请期待
注:查看代码请点下一页
提示:已经把所有模块转成PDF文档,链接地址:http://www.amobbs.com/thread-5594342-1-1.html

寄存器功能
I0口初始化
PORT寄存器
一个简单的流水灯

出0入0汤圆

发表于 2014-9-3 09:12:45 | 显示全部楼层
楼主又开始分享了   不错不错 支持

出0入0汤圆

发表于 2014-9-3 09:14:26 | 显示全部楼层
支持一下!   

出0入0汤圆

发表于 2014-9-3 09:15:39 | 显示全部楼层
感谢露珠分享

出0入0汤圆

 楼主| 发表于 2014-9-3 09:16:38 | 显示全部楼层


串口初始化……
#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)); //禁止发送接收   控制寄存器C2
  
  UART4_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;
}

出0入0汤圆

发表于 2014-9-3 09:18:27 | 显示全部楼层
谢谢楼主分享!

出0入0汤圆

 楼主| 发表于 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 使能PORTA
PORTA_PCR12下降沿触发(1010)
使能上拉输出
PORTA的中断号
重定义中断服务函数
中断服务函数
#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寄存器

程序运行……


出0入0汤圆

 楼主| 发表于 2014-9-3 09:26:45 | 显示全部楼层
本帖最后由 cn_x 于 2014-9-3 09:29 编辑

#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)
AD初始化函数
void ADC0_init(void)
{

  SIM_SCGC6 |= (1<<27);

  ADC0_CFG1 |= (1<<5) //ADIV
            |(1<<4)           // ADLSMP 1
            |(3<<2);   // MODE  11

  ADC0_CFG1 &= ~((1<<6) | (3)); //ADIV 01  ADICLK 00

  ADC0_CFG2 |= (1<<2);        // ADHSC   1

  ADC0_CFG2 &= ~(3);  //ADLSTS 00

  ADC0_SC2 &= ~(3);           // REFSEL  00 电压源选择

  ADC0_SC3 |= ((2)             // AVGS
           | (1<<2));            // AVGE 1 使能平均

  ADC0_SC3 &= ~(1);           // AVGS 10 16次采样平均


}
涉及的寄存器……
AD采集函数
U16 ADC0_SE11_GETDATA(void)
{

  U16 ADResult = 0;

  ADC0_SC1A &= ~((1<<5) | (1<<6)); //DIDF 0  ALEN 0

  ADC0_SC1A &= ~((1<<2) | (1<<4));  //设置AD通道  AD11(PRA8)
  ADC0_SC1A |= ((1<<3) | (3));

  while (!(ADC0_SC1A>>7));

  ADResult = ADC0_RA;

  return(ADResult);

}
涉及的寄存器……
主函数
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);
  }


}






出0入4汤圆

发表于 2014-9-3 09:27:24 | 显示全部楼层
支持一下楼主的辛勤工作。

出0入0汤圆

发表于 2014-9-3 09:31:58 | 显示全部楼层
这个可以精华啦。

出0入0汤圆

发表于 2014-9-3 09:32:47 | 显示全部楼层
对了 楼主能做个PDF吗?这样就方便收藏了。

出0入0汤圆

 楼主| 发表于 2014-9-3 09:33:21 | 显示全部楼层
(Kinetis K60) PIT定时中断
PIT_LDVALn寄存器的值为计数的值。当计数递减为0时,进入中断服务函数,而计数递减的周期是通过kinetis的BUS时钟分频……
PIT的时钟源是总线时钟。总线时钟是由MCGOUTCLK 经OUTDIV2分频得到。(内核时钟是经OUTDIV1分频得到)
  SIM_CLKDIV1 &= ~(7<<25);

  SIM_CLKDIV1 |= (1<<24);


初始化 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"
#undef  VECTOR_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;   

}
程序运行……



出0入0汤圆

发表于 2014-9-3 09:34:02 | 显示全部楼层
移位  与  反 或  

出0入0汤圆

 楼主| 发表于 2014-9-3 09:34:36 | 显示全部楼层
sblpp 发表于 2014-9-3 09:32
对了 楼主能做个PDF吗?这样就方便收藏了。

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

出0入0汤圆

发表于 2014-9-3 09:34:51 | 显示全部楼层
楼主可以讲讲始终那块的寄存器配置哈,

出0入0汤圆

发表于 2014-9-3 09:36:32 | 显示全部楼层
cn_x 发表于 2014-9-3 09:34
那我直接转成PDF吧
要费点时间

感谢楼主
顶一个先。

出0入0汤圆

发表于 2014-9-3 09:40:21 | 显示全部楼层
楼主,有EEPROM和DAC的吗?求分享!!

出100入101汤圆

发表于 2014-9-3 10:05:01 | 显示全部楼层
收藏,待用!

出0入0汤圆

 楼主| 发表于 2014-9-3 10:18:40 | 显示全部楼层
sblpp 发表于 2014-9-3 09:32
对了 楼主能做个PDF吗?这样就方便收藏了。

已全部转为PDF
重新开贴:
http://www.amobbs.com/forum.php? ... p;page=1#pid7836694

出0入0汤圆

 楼主| 发表于 2014-9-3 10:20:49 | 显示全部楼层
sdlibin007 发表于 2014-9-3 09:40
楼主,有EEPROM和DAC的吗?求分享!!

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

出0入0汤圆

发表于 2014-9-3 10:28:46 | 显示全部楼层
支持一下

出0入0汤圆

发表于 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可 ...

多谢楼主!!

出0入0汤圆

发表于 2014-9-3 11:09:53 | 显示全部楼层
楼主辛苦了      谢谢            收下

出0入0汤圆

发表于 2014-9-3 12:18:20 | 显示全部楼层
飞思官网上的例程sample code好像就是寄存器的吧

出0入0汤圆

发表于 2014-9-3 13:14:06 | 显示全部楼层
顶 寄存器配置可以更了解底层

出0入0汤圆

发表于 2014-9-3 13:21:07 | 显示全部楼层
楼主飞币不少了啊,什么节奏

出0入0汤圆

发表于 2014-9-3 21:20:58 | 显示全部楼层
你们都在努力,我有什么不努力的理由呢   

出0入0汤圆

发表于 2014-9-18 08:49:00 | 显示全部楼层
接触一个新的单片机一般先寄存器直接操作,然后再用库文件,谢谢了!  

出0入0汤圆

发表于 2014-9-22 20:53:59 | 显示全部楼层
寄存器的操作其实最简单明了,但需要花不少的时间读手册。关键飞思的中文资料太少,菜鸟勿近啊。

出0入0汤圆

发表于 2014-9-23 11:30:23 | 显示全部楼层
还是喜欢直接写寄存器的感觉,不用担心效率,不用担心中途会出错,很直接。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 16:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表