OpenEdv-开源电子网

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

关于用USART1来判断程序进程的疑惑(初学者请多多救助哈)

[复制链接]

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-6-1
在线时间
20 小时
发表于 2018-6-3 17:08:11 | 显示全部楼层 |阅读模式
2金钱
#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "stdint.h"



void My_USART3_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStrue;
        USART_InitTypeDef USART_InitStrue;
        NVIC_InitTypeDef NVIC_InitStrue;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//¢ù
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
       
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStrue);//¢ú
       
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_11;
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStrue);//¢ú
       
        USART_InitStrue.USART_BaudRate=115200;
        USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        USART_InitStrue.USART_Parity=USART_Parity_No;
        USART_InitStrue.USART_StopBits=USART_StopBits_1;
        USART_InitStrue.USART_WordLength=USART_WordLength_8b;
        USART_Init(USART3,&USART_InitStrue);//¢Û
       
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//¿aÆô½óêÕÖD¶Ï
       
        NVIC_InitStrue.NVIC_IRQChannel=USART3_IRQn;
        NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;       
        NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStrue);       
       
        USART_Cmd(USART3,ENABLE);//ê1Äü′®¿ú3
       
}

void USART3_IRQHandler(void)
{
        u8 res;
        USART_ClearFlag(USART3,USART_FLAG_TC);
        if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
        {               
                res= USART_ReceiveData(USART3);
                USART_SendData(USART3,res);
                while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);                 
                printf("1\r\n");
        }
}
int main(void)
{       
  uint16_t i;         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        My_USART3_Init();
        delay_init();
         for(i=1;i<=9;i++)
         {
           USART_SendData(USART3,i);
         }
   while(1);       
}
    各位师傅们:我有两个问题:
    首先我的板子是STM32F103RCT6的
   1:该怎么用串口1去判断程序进行到了那里呢?

   2:这个串口3发送的数据为什么没有达到我想要的:按下按键,XCOM里输出1-9的数字?
   请师傅们不吝赐教,谢谢谢谢!













最佳答案

查看完整内容[请看2#楼]

1,通过printf输出。 2,USART_SendData(USART3,i);后必须等待发送完成,否则不会发送出你想要的所有数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-6-3 17:08:12 | 显示全部楼层
1,通过printf输出。
2,USART_SendData(USART3,i);后必须等待发送完成,否则不会发送出你想要的所有数据。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
发表于 2018-6-3 19:39:09 | 显示全部楼层
对于第一个问题,你首先需要对串口1进行配置(IO、码率、工作方式、发射使能,串口使能等),然后在程序中设置一些串口1发送到XCOM的语句,判断程序是否进行到你写的这段话!
对于第二个问题,你貌似没有使能串口3的发送位,仅仅使能了串口3的接收,这样的话USART_SendData(USART3,i)这句话应该发送不出去。
回复

使用道具 举报

7

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1279
金钱
1279
注册时间
2017-7-18
在线时间
257 小时
发表于 2018-6-3 20:46:01 | 显示全部楼层
res= USART_ReceiveData(USART3);
                USART_SendData(USART3,res);
                while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);                  
                printf("1\r\n");
这里需要串口三接收中断之后才会执行
串口1没有初始化
按键没有初始化。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-6-3 20:53:12 | 显示全部楼层
USART_SendData(USART3,i);假设发送8(i=8),你发送的是0x08,在串口调试助手中没法显示8,你得发送0x38才能在串口调试助手中看到8这个字符。去看看ASCII码表
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-6-1
在线时间
20 小时
 楼主| 发表于 2018-6-4 22:13:30 | 显示全部楼层
胖子阳 发表于 2018-6-3 19:39
对于第一个问题,你首先需要对串口1进行配置(IO、码率、工作方式、发射使能,串口使能等),然后在程序中 ...

  嗯嗯,谢谢!我看USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;这句话是使能收发和接收的,串口3是可以接受到东西的,但是东西不太对头
回复

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-6-1
在线时间
20 小时
 楼主| 发表于 2018-6-4 22:26:44 | 显示全部楼层
周易八索连山 发表于 2018-6-3 20:46
res= USART_ReceiveData(USART3);
                USART_SendData(USART3,res);
                whi ...

嗯嗯,谢谢!不过还是有点疑虑:这里按键不初始化,按下按键的时候好像也可以执行吧,因为程序从头开始执行了,我这样理解有没有道理呢?
回复

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-6-1
在线时间
20 小时
 楼主| 发表于 2018-6-4 22:40:13 | 显示全部楼层
szczyb1314 发表于 2018-6-3 20:53
USART_SendData(USART3,i);假设发送8(i=8),你发送的是0x08,在串口调试助手中没法显示8,你得发送0x38才 ...

嗯呢!谢谢,能问问为什么它不往下执行吗?
int main(void)
{       
  uint16_t i;         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        My_USART3_Init();
        delay_init();
         //uart_init(9600);
           USART_SendData(USART3,0x38);
         USART_SendData(USART3,0x38);
         USART_SendData(USART3,32);
         USART_SendData(USART3,10);
         USART_SendData(USART3,0x38);
   while(1);       
}
我是觉得按下按键后,程序重新开始执行,应该会往下走呀?这是为什么?
回复

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-6-1
在线时间
20 小时
 楼主| 发表于 2018-6-4 23:19:51 | 显示全部楼层
szczyb1314 发表于 2018-6-3 20:53
USART_SendData(USART3,i);假设发送8(i=8),你发送的是0x08,在串口调试助手中没法显示8,你得发送0x38才 ...

        对于上面这个程序,我用USB转TTL来连接电脑和开发板,开发板下载好程序,然后打开XCOM,选择USB转TTL所在端口,在XCOM里输入东西后没有东西输出,这又是为什么啊?麻烦师傅细细解答一下!是因为我的USB转TTL坏了?
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-6-5 08:59:30 | 显示全部楼层
大力水手PP 发表于 2018-6-4 23:19
对于上面这个程序,我用USB转TTL来连接电脑和开发板,开发板下载好程序,然后打开XCOM,选择USB ...

你上面的程序按下复位按键应该有输出
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-6-1
在线时间
20 小时
 楼主| 发表于 2018-6-5 12:28:03 | 显示全部楼层
正点原子 发表于 2018-6-3 17:08
1,通过printf输出。
2,USART_SendData(USART3,i);后必须等待发送完成,否则不会发送出你想要的所有数据 ...

1.是再主函数里先初始化串口1,然后printf()输出是直接写在主函数里面吗?
2这个等待好像很慢,而且输出的东西不是数字的,是一些乱码,所以如果要发送数据的话还要写成ASCII码的形式吧?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 21:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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