uart

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)都不能清除中断标识位,导致数据不能发送。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值