FM33LE026串口通信例程详解
最近由于工作需要开始使用国产的复旦微FM系列32位单片机芯片,由于网络上存在的资料较少,所以准备自己进行整理,一方面是方便后来者参考抛砖引玉,另外一方面是作为自己的工作笔记,方便自己日后回忆思考。我个人是希望在工作中能够有闲暇的时间把大部分的例程都解析一遍,但能不能实现就是未知数了。
串口简介
串口是十分常用的串行通信接口,需要注意的是,FM33LE0系列的单片机均无同步串口USART,仅有异步串口UART。
相关通信接口可参看复旦微公司提供的芯片手册。
例程代码解析
复旦微官方提供的例程看上去是十分简洁明了的。
#include "main.h"
#include "fm33le0xx_fl.h"
#include "uart0_interrupt.h"
extern uint8_t RxBuf[255];
extern uint8_t RxLen;
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
/* SHOULD BE KEPT!!! */
MF_Clock_Init();
/* Configure the system clock */
/* SHOULD BE KEPT!!! */
MF_SystemClock_Config(); //空函数
/* Initialize FL Driver Library */
/* SHOULD BE KEPT!!! */
FL_Init(); //使能了系统滴答时钟
/* Initialize all configured peripherals */
/* SHOULD BE KEPT!!! */
MF_Config_Init(); //使能了串口和中断
Uart0_TXRX_Interrupt();
FL_DelayMs(100);
while(1)
{
if(CheckRxIsOver() == true)
{
printfUART0("Receive data:");
printfUART0(RxBuf);
RxLen = 0;
}
//FL_DelayMs(1000);
}
}
main函数中初始化的过程只包括了五个函数
首先是MF_Clock_Init 函数定义在my_config中
void MF_Clock_Init(void)
{
/* MCU Configuration--------------------------------------------------------*/
FL_RCC_EnableGroup1BusClock(FL_RCC_GROUP1_BUSCLK_RTC);
FL_RTC_WriteAdjustValue(RTC, 0);
FL_RCC_DisableGroup1BusClock(FL_RCC_GROUP1_BUSCLK_RTC);
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
/* System interrupt init*/
/* Initialize all configured peripherals */
}
从结论上来说,这个函数可以直接从main.c中删去。
这个函数做的功能是开启RTC的时钟使能,往RTC寄存器中写0,之后再关闭RTC时钟使能。而使用串口不涉及RTC时钟相关的功能。所以可以删去,当然,初始化了RTC时钟,然后再关闭,其实对使用单片机来说是无伤大雅的。
和STM32不同,FM系列的单片机的内部代码逻辑较为简单,上述时钟初始化函数内部调用的系统函数的逻辑十分简单,就是写对应的寄存器位,配置相应的硬件外设。以FL_RCC_EnableGroup1BusClock
函数为例,这个函数只有一行。
__STATIC_INLINE void FL_RCC_EnableGroup1BusClock(uint32_t Peripheral)
{
SET_BIT(RCC->PCLKCR1, ((Peripheral & 0xffffffff) << 0x0U));
}
SET_BIT内部只是做了简单的位或,实现了置位寄存器中某一个位的操作。
至于传参
#define FL_RCC_GROUP1_BUSCLK_RTC (0x1U << 2U)
查阅芯片手册即可得知
RTC总线时钟使能位就在低2位,所以FL_RCC_GROUP1_BUSCLK_RTC的值是1左移两位。
经过SET_BIT将其置位,即实现了RTC总线时钟的使能。设置RTC的值,以及关闭RTC时钟使能与之相似,所以再次不再赘述。
总之这个MF_Clock_Init函数,实现的功能就是如此——开启RTC时钟,将RTC的值置为0,然后将其关闭。
MF_SystemClock_Config是空函数,不需要解析,往下看下一个函数
void FL_Init(void)
{
/* Init delay support function */
FL_DelayInit();
}
FL_Init函数,其中只包含了FL_DelayInit()。这个函数的作用是将系统滴答定时器systick作为delay的时钟来使用。为单片机提供一系列延时函数
函数注释和文本内容见下。
/**
* @brief Initialize the timer(default is Systick) used as delay timer.
* @note The function is declared as __WEAK to be overwritten in case of other
* implementation in user file.
* @param None
* @retval None
*/
__WEAK void FL_DelayInit(void)
{