STM8之uart中断收发
一、写在前面
开发环境: IAR
使用芯片: STM8S007C8
MCU外接16MHz晶振,作为时钟源。
二、代码解析
程序目的: 使用MCU的发送和接收中断,当MCU接收到数据时,立即发送该数据。程序中定义了一个缓存数组:UART1_Buf
1. 时钟初始化
static void CLK_Config(void)
{
CLK_DeInit();
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);/* 配置分频系数为1 */
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); /* 设置外部高速晶振为时钟源 */
}
2. 串口1初始化
static void Uart1Init(void)
{
UART1_DeInit();
/* 1. 初始化串口 */
UART1_Init((uint32_t)(115200), UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
/* 2. 配置中断 */
UART1_ITConfig(UART1_IT_RXNE, ENABLE);
UART1_ITConfig(UART1_IT_TC, ENABLE);
/* 3. 使能串口 */
UART1_Cmd(ENABLE);
}
3. 主函数
在主函数中检测接收和发送的数据字节数是否相等,如果不等就将缓存中的数据发送出去。
void main()
{
CLK_Config();
Uart1Init();
printf("串口1初始化成功\r\n");
__enable_interrupt();
for(;;)
{
if(UART1_RX_Cnt != UART1_TX_Cnt)
{
if(UART1_TX_Busy_Flag == 0)
{
UART1_TX_Busy_Flag = 1;
UART1_SendData8(UART1_Buf[UART1_TX_Cnt++]);
if(UART1_TX_Cnt >= UART1_BUF_CNT_MAX)
{
UART1_TX_Cnt = 0;
}
}
}
}
}
4. MCU接收中断函数
void UART1_RX_IRQFunc(void)
{
UART1_ClearFlag(UART1_FLAG_RXNE); /* 清除中断标识 */
UART1_Buf[UART1_RX_Cnt++] = UART1_ReceiveData8();
if(UART1_RX_Cnt >= UART1_BUF_CNT_MAX)
{
UART1_RX_Cnt = 0;
}
}
5. MCU发送中断函数
void UART1_TX_IRQFunc(void)
{
UART1->SR &= ~(1<<6); /* 清除中断标志位 */
UART1_TX_Busy_Flag = 0;
}
三、编写代码过程中遇到的问题
1.出现 #error directive: “Please select first the target STM8S/A device used in your application (in stm8s.h file)” 错误
在stm8s.h中定义所使用MCU的型号,该错误解决
2.串口输出乱码
确定MCU外部所使用的晶振,在stm8s.h中默认使用的晶振频率为24MHz,如果使用16MHz需要修改。
3.待解决
在串口发送中断中,我使用的是 UART1->SR &= ~(1<<6) 来清除中断标识位,那么怎么使用库函数呢?
使用UART1_ClearFlag(UART1_FLAG_TC)和UART1_ClearITPendingBit(UART1_IT_TC)都不能清除中断标识位,导致数据不能发送。