野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 373|回复: 5

玩转STM32-21串口通信点灯练习(中断方式)

[复制链接]
发表于 2023-12-27 10:54:24 | 显示全部楼层 |阅读模式
内容是野火玩转stm32的教程“21-串口通信(第6节)”的作业,需求是“在串口调试助手中以十六进制发送”,以下是本人代码段,已调试无误。

中断服务函数
//串口中断服务函数点灯
void DEBUG_USARTx_IRQHandler(void)
{
    //检查中断源是否正确
    if(USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == SET)
    {
        uint8_t RecvData = USART_ReceiveData(DEBUG_USARTx);
        printf("接收到的数字:%d\n", RecvData);

        switch(RecvData)
        {
            case 0:
                LED_R(ON);
                LED_G(ON);
                LED_B(ON);
                break;
            case 1:
                LED_R(ON);
                LED_G(OFF);
                LED_B(OFF);
                break;
            case 2:
                LED_R(OFF);
                LED_G(ON);
                LED_B(OFF);
                break;
            case 3:
                LED_R(OFF);
                LED_G(OFF);
                LED_B(ON);
                break;
            default:
                LED_R(OFF);
                LED_G(OFF);
                LED_B(OFF);
                break;
        }
    }

    //清除中断标志
    USART_ClearITPendingBit(DEBUG_USARTx, USART_IT_RXNE); //可省略,USART_IT_RXNE在读取USARTx->DR后会硬件清零
}


主函数
int main(void)
{
    //uint8_t ch = 0;

    LED_GPIO_Config();
    USART_Config();

    printf("USART指令控制RGB彩灯\n");

    while(1)
    {;}
}



疑问:没太听懂火哥视频中说的要一个全局变量的作用,欢迎大佬交流指点!
回复

使用道具 举报

发表于 2023-12-28 11:07:07 | 显示全部楼层
中断还是尽可能的短比较好,中断里面只做基本的处理,你的判断、打印的这些都可以放到别的地方
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-4 20:47:31 | 显示全部楼层
菠萝片 发表于 2023-12-28 11:07
中断还是尽可能的短比较好,中断里面只做基本的处理,你的判断、打印的这些都可以放到别的地方 ...

感谢回复,针对本练习,我好像想不到如何再缩减中断服务函数了,因为我认为串口发送一个数据后触发中断,我需要在中断里判断发来的数据是0~3哪一个再去执行相应的点灯操作。
回复 支持 0 反对 1

使用道具 举报

发表于 2024-1-5 15:57:56 | 显示全部楼层
本帖最后由 Nalimca 于 2024-1-5 15:59 编辑
玲玲栖 发表于 2024-1-4 20:47
感谢回复,针对本练习,我好像想不到如何再缩减中断服务函数了,因为我认为串口发送一个数据后触发中断, ...

1.首先将uint8_t RecvData 变为全局变量.定义一个全局变量g_uart_irq_flag = 0;
2.
void DEBUG_USARTx_IRQHandler(void)
{
        RecvData  = USART_ReceiveData(DEBUG_USARTx);
        g_uart_irq_flag  = 1;
}
3.主函数
int main(void)
{
    //uint8_t ch = 0;

    LED_GPIO_Config();
    USART_Config();

    printf("USART指令控制RGB彩灯\n");

    while(1)
    {
        if(1 == g_uart_irq_flag )
        {
                g_uart_irq_flag = 0;
                  printf("接收到的数字:%d\n", RecvData);

                                switch(RecvData)
                                {
                                    case 0:
                                        LED_R(ON);
                                        LED_G(ON);
                                        LED_B(ON);
                                        break;
                                    case 1:
                                        LED_R(ON);
                                        LED_G(OFF);
                                        LED_B(OFF);
                                        break;
                                    case 2:
                                        LED_R(OFF);
                                        LED_G(ON);
                                        LED_B(OFF);
                                        break;
                                    case 3:
                                        LED_R(OFF);
                                        LED_G(OFF);
                                        LED_B(ON);
                                        break;
                                    default:
                                        LED_R(OFF);
                                        LED_G(OFF);
                                        LED_B(OFF);
                                        break;
                                }
        }
     }
}

这样的写法是很常见的中断写法.供你参考

回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-5 20:58:21 | 显示全部楼层
原来是用全局变量,十分感谢!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-15 10:09:12 | 显示全部楼层
玲玲栖 发表于 2024-1-5 20:58
原来是用全局变量,十分感谢!!

将RecvData定义为全局变量,中断服务函数中只做接收和将标志位置1(标志位指代中断服务函数是否触发完成);然后回到主函数中对接收到的RecvData做判断、打印等执行操作,并且将标志位清0。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-28 02:51 , Processed in 0.150204 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表