【征文活动】基于KL25芯片 飞思卡尔芯片 使用心得

2020-02-19 21:05发布

【背景】参与论坛的 《飞思卡尔KL25开源项目》
有幸参与了论坛的飞思卡尔KL25开源活动,http://www.amobbs.com/thread-5610374-1-1.html 开始真正接触到飞思卡尔的芯片。
下边这是苏州大学的板子,相信好些参与活动的人都有。
174053a911xcv9xf1ammfx.jpg.thumb.jpg (197.88 KB, 下载次数: 0) 下载附件 2015-3-1 17:13 上传

以前上家公司也用过飞思卡尔的芯片 MC90S 系列的,当时的印象是一个字贵,两个字高大,三个字就是高大上了,呵呵。当时看了下该芯片的环境是专用的,仿真器也是专用的。在AVR盛行的时候,个人感觉个人玩的话玩不起来。
刚好有这次征文活动,把我接触到飞思卡尔芯片以来,以一个飞思卡尔新手来说说芯片的使用感觉说一下,顺便说说我的入门经历和使用心得。
参加活动时候特意搜了下,基于MDK的环境的例程相对较少。心里有点悬。后来开发板收到了,看了下配套的书,大概翻了下基本资源的简介,心里有底了。
GPIO的配置,串口,SPI的配置,相对比较简单。跟STM32一大串关键字定义的库函数相比,可以理解为飞思卡尔的芯片的寄存器配置,就是稍微复杂的51单片机。
赶快到网上找例程,找DEMO程序。找到了一个点灯的。挡下来,看了下  MKL25Z4.h 的寄存器定义,关键字定义。对照书上发现不怎么对劲,举个例子 MDK例程 是 SIM->SCGC4 ,结果书上配套是 SIM_SCGC4。。。等等一些不太一样。
好在字符都是一样的。就是要动手修改。
慢慢的,熟悉了寄存器操作和 MKL25Z4.h 的定义 一切都变得简单了。
先写到这里,后边楼层会 谈谈,基于MDK的 飞思卡尔 KL25 的一些 模块的使用。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
jiang887786
1楼-- · 2020-02-20 19:05
 精彩回答 2  元偷偷看……
XUEPENGBIN
2楼-- · 2020-02-21 00:26
duhui75 发表于 2015-3-6 10:44
那得操作到猴年马月啊 工作是讲究效率的

没有啊。寄存器也没多少。都是比较简单的拉。。个人感觉,相比STM32来说。飞思卡尔的寄存器配置很简单。下一篇,写写,USART。。。最近有点忙。。
XUEPENGBIN
3楼-- · 2020-02-21 05:43
jiang887786 发表于 2015-3-6 11:03
楼主你的这个帖子很好,虽然我看了一遍没怎么明白,我再多看几遍。32位和原来16位的真是相差太大了。我那 ...

可能我的表达不是很清楚。给个完整的例子你就明白了。

void LCD_Gpio_Config(void)
         {

      SIM->SCGC5    |=(SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK );       //使能时钟A------E
//配置PD0---PD7 为普通IO;                  
      PORTD->PCR[0]  = PORT_PCR_MUX(1);                     
      PORTD->PCR[1]  = PORT_PCR_MUX(1);                     
      PORTD->PCR[2]  = PORT_PCR_MUX(1);                       
      PORTD->PCR[3]  = PORT_PCR_MUX(1);               
      PORTD->PCR[4]  = PORT_PCR_MUX(1);                       
      PORTD->PCR[5]  = PORT_PCR_MUX(1);                     
      PORTD->PCR[6]  = PORT_PCR_MUX(1);               
      PORTD->PCR[7]  = PORT_PCR_MUX(1);     
//设置输出高电平                  
      FPTD->PDOR = 0XFF;  
//设置管脚为输出                                    
      FPTD->PDDR = 0XFF;                                                             
   }       
管脚初始化就好了。
下边是预定义
#define CSRC522L  FPTD->PCOR   |= 1UL << 0
#define CSRC522H  FPTD->PSOR   |= 1UL << 0


int main (void)
{
CSRC522L  ;
.
.
.
CSRC522H  ;
.

.
}
XUEPENGBIN
4楼-- · 2020-02-21 06:44
飞思卡尔串口的使用。。。

#define UART_PARAM_DEBUG        0                                                       /* 是否进行参数检查     */
#define UART_PARAM_PORTNUM(x)   (x > 3? 1 : 0)                                  /* 端口号检查           */
#define UART_PARAM_MODE(x)      (x > 3? 1 : 0)                                     /* 模式检查             */
#define UART_PARAM_LENGTH(x)    ((x == 8)||(x == 9)||(x == 9) ? 1 : 0)          /* 数据长度检查         */
#define UART_PARAM_STOP(x)      ((x == 1)||(x == 2)? 1 : 0)                           /* 停止位检查           */
#define UART_PARAM_PARITY(x)    ((x == 0)||(x == 1)? 1 : 0)                          /* 校验位检查           */
#define UART_PARAM_LOGIC(x)     ((x == 0)||(x == 1)? 1 : 0)                          /* 逻辑位检查           */
#define UART_CHECK_PARAM(x)     (x? (while (1)):)                                          /* 错误处理             */

#define UART0_DEFAULT_OPEN      1                                               /* 是否默认打开传输          */                                
#define UART0_IRQ_ENABLE        1                                                 /* 串口中断允许          */   

#define UART1_DEFAULT_OPEN      1                                              /* 是否默认打开传输          */                              
#define UART1_IRQ_ENABLE        1                                                 /* 串口中断允许          */

串口1和串口2 是基本相同,把串口1分析一下。
void uart1Init( uint32_t  ulBaudRate,
                uint8_t   ucParityEnable,
                uint8_t   ucParityType,
                uint8_t   ucDataLength,
                uint8_t   ucStopBit)
{
    register uint16_t usBaudRate  = 0;  

#if UART_PARAM_DEBUG
    UART_CHECK_PARAM(UART_PARAM_LENGTH(ucDataLength));
    UART_CHECK_PARAM(UART_PARAM_STOP(ucStopBit));
    UART_CHECK_PARAM(UART_PARAM_LOGIC(ucParityEnable));
    UART_CHECK_PARAM(UART_PARAM_PARITY(ucParityType));   
#endif  
   
    SIM->SCGC4 |= SIM_SCGC4_UART1_MASK;                                          /* 允许外设时钟         */      
    uart1TranControl(UART_TX_DISABLE, UART_RX_DISABLE);                         /* 首先禁止通信         */

// 配置串口使用的引脚;
    PORTC->PCR[3] = PORT_PCR_MUX(0x3);                                            /* UART0_TXD            */
    PORTC->PCR[4] = PORT_PCR_MUX(0x3);                                            /* UART0_RXD            */
// 有485的话,配置485的控制引脚       
    PORTC->PCR[2] = PORT_PCR_MUX(0x1);   
    FPTC->PDOR |=  (1UL<<2);
    FPTC->PDDR |=  (1UL<<2);
//485控制引脚配置结束       
    UART1->C1  &= ~(UART_C1_M_MASK |  UART_C1_PT_MASK |  UART_C1_PE_MASK);  /* 数据长度             */
                                                                            /* 校验位类型           */
                                                                            /* 校验位               */
   
    UART1->C1  |= ((ucDataLength - 8UL) << UART_C1_M_SHIFT)|
                            (ucParityEnable << UART_C1_PE_SHIFT)|
                            (ucParityType << UART_C1_PT_SHIFT);               

   
    usBaudRate = SystemBusClock/(ulBaudRate * 16);  
               
    UART1->BDH   =  (usBaudRate & 0x1F00) >> 8;                         /* 波特率               */
    UART1->BDL   =  (uint8_t)(usBaudRate & UART_BDL_SBR_MASK);
    UART1->BDH  &= ~UART_BDH_SBNS_MASK;                                 /* 停止位               */
    UART1->BDH  |=  (ucStopBit - 1) << UART_BDH_SBNS_SHIFT;
               
    UART1->C2   &= ~(UART_C2_TIE_MASK  |
                           UART_C2_TCIE_MASK |
                                                                                 UART_C2_RIE_MASK  |
                                                                                 UART_C2_ILIE_MASK);                                /* 清除中断设置         */
                                

    while((UART1->S1  & UART_S1_RDRF_MASK) && (UART1->D));                                               /* 清接收缓冲区         */
   
    #if UART1_DEFAULT_OPEN   
    uart1TranControl(UART_TX_ENABLE, UART_RX_ENABLE);                           /* 配置完成允许通信     */
    #endif

    #if UART1_IRQ_ENABLE        
        #if UART1_SEND_IRQ
        UART1->C2  |= UART_C2_TCIE_MASK;
        #endif
        #if UART1_RECEIVE_IRQ
        UART1->C2   |= UART_C2_RIE_MASK;
        #endif                  
    NVIC_EnableIRQ(UART1_IRQn);                        
    #endif            
}
//串口传输控制。
void uart1TranControl(uint8_t ucTxEnable,
                      uint8_t ucRxEnable)
{
     
#if UART_PARAM_DEBUG
    UART_CHECK_PARAM(UART_PARAM_LOGIC(ucTxEnable));
    UART_CHECK_PARAM(UART_PARAM_LOGIC(ucRxEnable));
#endif   

    UART1->C2  &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK);
    UART1->C2  |= (ucTxEnable << UART_C2_TE_SHIFT)| (ucRxEnable << UART_C2_RE_SHIFT);
   
}
如果使能中断了下边是串口中断服务程序
由于串口的中断包括发送和接收中断。在此根据标记位来区分;


UART0_S1_RDRF_MASK  串口接收到有效数据
UART0_S1_TDRE_MASK  串口发送寄存器空
UART0_C2_TIE_MASK    串口发送中断使能位

void UART0_IRQHandler(void)
{   
   __disable_irq();   
   #if UART0_SEND_IRQ
                                                                               /* 发送中断处理程序     */
   while((UART0->S1  & UART0_S1_TDRE_MASK)&&(UART0->C2 & UART0_C2_TIE_MASK))
          {  
                                        (用户的发送中断处理函数);
        }                                                                                     
   #endif
   #if UART0_RECEIVE_IRQ
   while(UART0->S1  & UART0_S1_RDRF_MASK)
                    {  
                                        (用户的接收中断处理函数)
                     }                         
   #endif
          __enable_irq();                               
}

在用户写发送程序时 根据发送的数据缓冲来判断发送数据是否是最后一个字节,是的话,要及时清除掉 UART0_C2_TIE_MASK 这样就可以自由控制串口串口发送中断。

一周热门 更多>