【背景】参与论坛的 《飞思卡尔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 的一些 模块的使用。
没有啊。寄存器也没多少。都是比较简单的拉。。个人感觉,相比STM32来说。飞思卡尔的寄存器配置很简单。下一篇,写写,USART。。。最近有点忙。。
可能我的表达不是很清楚。给个完整的例子你就明白了。
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 ;
.
.
}
#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 这样就可以自由控制串口串口发送中断。
一周热门 更多>