OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2074|回复: 7

串口助手控制开发板硬件

[复制链接]

11

主题

60

帖子

0

精华

高级会员

Rank: 4

积分
635
金钱
635
注册时间
2018-3-26
在线时间
107 小时
发表于 2018-9-29 13:35:38 | 显示全部楼层 |阅读模式
我想使用串口调试助手,通过发送数字,控制32开发板上的硬件。
实现通过串口调试助手发送数字 1:实现LED灯一直处于闪烁状态;发送不是数字 1      LED灯熄灭.怎么打断main函数中的次级while。
我的想法:通过改变uart_init 中MY_NVIC_Init(3,3,USART1_IRQn,2);将此优先级改高。高于main(main的优先级是多少?这个不太了解,没查到),这样void USART1_IRQHandler(void)中接收到的值就会高于主函数的while循环,从而改变while(A)中A的条件,跳出while;

int main(void)
{        
        volatile u16 Res;
        
        u16 t;
        u16 len;        
        u16 times=0;   
        Stm32_Clock_Init(9);        //系统时钟设置
        //uart_init(72,115200);         //串口初始化为115200
        uart_init(72,9600);
        delay_init(72);                            //延时初始化
        LED_Init();                                  //初始化与LED连接的硬件接口
        while(1)
        {
                if(USART_RX_STA&0x8000)//用来判断是否接收到数据
                {                                          
                        len=USART_RX_STA&0x3FFF;//得到此次接收到的数据长度
                        //printf("\r\n您发送的消息为:\r\n\r\n");
                        printf("\r\n您发送的消息是:\r\n\r\n");
                        
                                       

                        for(t=0;t<len;t++) //USART_SendData
                        {
                                USART1->DR=USART_RX_BUF[t];        
                                while((USART1->SR&0X40)==0);//等待发送结束
                        }        

                        
        
                        /***************************/
                        Res=USART_RX_BUF[0];                                //这一句要加上,否则不能正常执行串口助手控制单片机
                        /***************************/
                                while(Res=='1')
                                {
                                printf("\r\n奥特曼:\r\n\r\n");
                                LED0=!LED0;
                                delay_ms(1000);        
                                }
                                LED0=1;
                                printf("\r\n\r\n");//插入换行
                                USART_RX_STA=0;//接收状态标记
                }
                else
                {
                        times++;
                        if(times%5000==0)
                        {
                                printf("\r\n战舰STM32开发板 串口实验\r\n");
                                //printf("正点原子@ALIENTEK\r\n\r\n");
                                printf("hello world\r\n\r\n");
                        }
                        if(times%200==0)printf("请输入数据,以回车键结束\r\n");  
                        if(times%30==0)
                        {                        
                                LED1=!LED1;//闪烁LED,提示系统正在运行.
                        }

                        delay_ms(10);   
                }
               
        }                 
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2018-9-29 13:47:36 | 显示全部楼层
使用标志位就行了,串口接受判断是不是1,改变标志位,主程序判断标志位更改灯号
回复 支持 反对

使用道具 举报

11

主题

60

帖子

0

精华

高级会员

Rank: 4

积分
635
金钱
635
注册时间
2018-3-26
在线时间
107 小时
 楼主| 发表于 2018-9-29 14:37:27 | 显示全部楼层
a5820736 发表于 2018-9-29 13:47
使用标志位就行了,串口接受判断是不是1,改变标志位,主程序判断标志位更改灯号



这个是根据你说的加标志位
void USART1_IRQHandler(void)
{
        u8 res;       
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();   
#endif
        if(USART1->SR&(1<<5))        //接收到数据
        {         
                res=USART1->DR;
                if((USART_RX_STA&0x8000)==0)//接收未完成
                {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                        {
                                if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                                else USART_RX_STA|=0x8000;        //接收完成了
                        }else //还没收到0X0D
                        {       
                                if(res==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
                                }                 
                        }
                }
               
                //加标志位判断
                /**************************/
                        a=USART_RX_BUF[0];//提取数值
                        if(a=='1')//判断是否接收到 1
                        {
                                Flag=1;//标志位
                        }       
                        else
                        {
                                Flag=0;
                        }
                /************************/
                       
                       
        }


这个是主函数判断标志位改变
int main(void)
{       
        volatile u16 Res;
       
        u16 t;
        u16 len;       
        u16 times=0;   
        Stm32_Clock_Init(9);        //系统时钟设置
        //uart_init(72,115200);         //串口初始化为115200
        uart_init(72,9600);
        delay_init(72);                            //延时初始化
        LED_Init();                                  //初始化与LED连接的硬件接口
        while(1)
        {
                if(USART_RX_STA&0x8000)//用来判断是否接收到数据
                {                                          
                        len=USART_RX_STA&0x3FFF;//得到此次接收到的数据长度
                        //printf("\r\n您发送的消息为:\r\n\r\n");
                        printf("\r\n您发送的消息是:\r\n\r\n");
                       
                                       

                        for(t=0;t<len;t++) //USART_SendData
                        {
                                USART1->DR=USART_RX_BUF[t];       
                                while((USART1->SR&0X40)==0);//等待发送结束
                        }       

                       
       
                        /***************************/
                        Res=USART_RX_BUF[0];                                //这一句要加上,否则不能正常执行串口助手控制单片机
                        /***************************/
                       
                        //串口调试助手 输入数字 1,对应ASCII码为 31,再将0x31转为十进制49
               
                                if(Flag==1)
                                {
                                        while(1)
                                        {
                                                printf("\r\n奥特曼:\r\n\r\n");
                                                LED0=!LED0;
                                                delay_ms(1000);       
                                        }

                                }
                                else
                                {
                                       
                                printf("\r\n小怪兽:\r\n\r\n");
                                       
                                }
                               
                                printf("\r\n\r\n");//插入换行
                                USART_RX_STA=0;//接收状态标记
                }
               
是不是写的有问题,没有解决,望指正
回复 支持 反对

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2018-9-29 14:47:39 | 显示全部楼层
你这程序逻辑有点问题,要改挺多,你先完成电脑发1led亮这个小工能,下面就很容易了
回复 支持 反对

使用道具 举报

11

主题

60

帖子

0

精华

高级会员

Rank: 4

积分
635
金钱
635
注册时间
2018-3-26
在线时间
107 小时
 楼主| 发表于 2018-9-29 14:52:25 | 显示全部楼层
a5820736 发表于 2018-9-29 14:47
你这程序逻辑有点问题,要改挺多,你先完成电脑发1led亮这个小工能,下面就很容易了

其实把那个while改为if判断就实现了。我是已经实现了发送1就能点亮led的功能了。我想拓展点,就是可以发1,led可以一直闪烁。想了只能卡whil。但是进入了while 出不来了,就想怎么改变while里面的值。按理说UART中断中接收值改变应该可以影响main里面while的条件
回复 支持 反对

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2018-9-29 15:15:45 | 显示全部楼层
  while(1)
                                        {
                                                printf("\r\n奥特曼:\r\n\r\n");
                                                LED0=!LED0;
                                                delay_ms(1000);      
                                        }
这个while有问题,如果flag=1,进入这个循环,中断出来后还是在这个循环中,所以flag改变就没意义了,其实不用这么多死循环的,又不是带OS的
回复 支持 反对

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2018-9-29 15:19:38 | 显示全部楼层
default flag=0,进入main的大循环后,判断flag,灯灭,会不断判断,一直是灭,当串口中断发生,改变了flag,这时就会进入另一个判断语句,进入另一种灯状态,然后循环,只要你的flag不变,灯的状态就不会变,就是这种逻辑,你理一下,很容易的
回复 支持 反对

使用道具 举报

11

主题

60

帖子

0

精华

高级会员

Rank: 4

积分
635
金钱
635
注册时间
2018-3-26
在线时间
107 小时
 楼主| 发表于 2018-9-29 15:48:18 | 显示全部楼层
a5820736 发表于 2018-9-29 15:19
default flag=0,进入main的大循环后,判断flag,灯灭,会不断判断,一直是灭,当串口中断发生,改变了flag ...

ok。我了解了,没有考虑大框架,光想着内部再嵌入while了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 06:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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