野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9544|回复: 6

21串口通信(第四节)发送两个字节,现象与老师讲的不符合

[复制链接]
发表于 2022-3-3 21:31:35 | 显示全部楼层 |阅读模式
本帖最后由 嵌入式小明 于 2022-3-6 15:22 编辑

视频地址【单片机】野火STM32F103教学视频 (配套霸道/指南者/MINI)【全】(刘火良老师出品) (无字幕)_哔哩哔哩_bilibili  5分50秒之前的内容我所有的代码都照着老师的程序敲的,该cv的就跟着cv,他敲的我也照着敲,串口也是一样的设置,但是,具体看下面的实验现象吧。
具体代码如下:

  1. //bsp_usart.c程序,跟着老师在配套例程里面copy而来
  2. #include "bsp_usart.h"

  3. static void NVIC_Configuration(void)
  4. {
  5.   NVIC_InitTypeDef NVIC_InitStructure;
  6.   
  7.   /* 嵌套向量中断控制器组选择 */
  8.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  9.   
  10.   /* 配置USART为中断源 */
  11.   NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  12.   /* 抢断优先级*/
  13.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  14.   /* 子优先级 */
  15.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  16.   /* 使能中断 */
  17.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  18.   /* 初始化配置NVIC */
  19.   NVIC_Init(&NVIC_InitStructure);
  20. }


  21. void USART_Config(void)
  22. {
  23.         GPIO_InitTypeDef GPIO_InitStructure;
  24.         USART_InitTypeDef USART_InitStructure;

  25.         // 打开串口GPIO的时钟
  26.         DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
  27.         
  28.         // 打开串口外设的时钟
  29.         DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

  30.         // 将USART Tx的GPIO配置为推挽复用模式
  31.         GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
  32.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  33.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34.         GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  35.   // 将USART Rx的GPIO配置为浮空输入模式
  36.         GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
  37.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  38.         GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
  39.         
  40.         // 配置串口的工作参数
  41.         // 配置波特率
  42.         USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
  43.         // 配置 针数据字长
  44.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  45.         // 配置停止位
  46.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  47.         // 配置校验位
  48.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  49.         // 配置硬件流控制
  50.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  51.         // 配置工作模式,收发一起
  52.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  53.         // 完成串口的初始化配置
  54.         USART_Init(DEBUG_USARTx, &USART_InitStructure);
  55.         
  56.         // 串口中断优先级配置
  57.         NVIC_Configuration();
  58.         
  59.         // 使能串口接收中断
  60.         USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);        
  61.         
  62.         // 使能串口
  63.         USART_Cmd(DEBUG_USARTx, ENABLE);            
  64. }


  65. /********以下是跟着老师敲的**********/
  66. //发送一个字节数据
  67. void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
  68. {
  69.         USART_SendData(pUSARTx, data);
  70.         while( USART_GetFlagStatus(pUSARTx,  USART_FLAG_RXNE) == RESET);

  71. }
  72. /********我感觉如果要出问题的话,应该也是在下面这个程序出问题,但是我真的是跟着敲的,前后对比都没有错**/
复制代码
  1. //bsp_usart.h头文件程序,这个也是跟着老师在配套例程里面copy的
  2. #ifndef __BSP_USART_H
  3. #define __BSP_USART_H

  4. #include "stm32f10x.h"

  5. #define  DEBUG_USARTx                   USART1
  6. #define  DEBUG_USART_CLK                RCC_APB2Periph_USART1
  7. #define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
  8. #define  DEBUG_USART_BAUDRATE           115200

  9. // USART GPIO 引脚宏定义
  10. #define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
  11. #define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
  12.    
  13. #define  DEBUG_USART_TX_GPIO_PORT       GPIOA   
  14. #define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_9
  15. #define  DEBUG_USART_RX_GPIO_PORT       GPIOA
  16. #define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10

  17. #define  DEBUG_USART_IRQ                USART1_IRQn
  18. #define  DEBUG_USART_IRQHandler         USART1_IRQHandler

  19. void USART_Config(void);
  20. void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data);
  21. void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data);

  22. #endif /* __BSP_USART_H */
复制代码
  1. //main.c程序,跟着老师敲的
  2. #include "stm32f10x.h"
  3. #include "bsp_led.h"
  4. #include "bsp_usart.h"

  5. int main(void)
  6. {
  7.         USART_Config();
复制代码
老师的使用的下载器下载的程序,我用的是串口下载的程序,老师按下复位键之后的实验现象如下:
野火论坛202203032133552305..png
我按下复位键之后,只显示了字符A,如下
野火论坛202203032134471089..png




麻烦大家了,


USTAR程序.pdf

107.26 KB, 下载次数: 35

回复

使用道具 举报

发表于 2022-3-4 17:44:13 | 显示全部楼层
你的代码复制过来不全,上传个附件吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-6 15:27:07 | 显示全部楼层
一级菜鸟 发表于 2022-3-4 17:44
你的代码复制过来不全,上传个附件吧

我用pdf上传了,您看下,多谢多谢。
回复 支持 反对

使用道具 举报

发表于 2022-3-7 14:45:48 | 显示全部楼层
有几个问题啊,第一,你提问题的方式一定要清楚,别人才能理解到,比如你说现象不符合,到底是怎样的不符合,描述清楚;
第二就是表达错误,比如0xAABBH这个数据,0xAA是高字节,不是高位,0xBB是低字节;
第三,你main函数调用的字符发送函数,Usart_SendByte是发送单字节的函数,你不能去发送双字节的变量,否则高字节肯定会丢失,Usart_SendHalfWord是发送双字节的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-8 21:58:47 | 显示全部楼层
quar 发表于 2022-3-7 14:45
有几个问题啊,第一,你提问题的方式一定要清楚,别人才能理解到,比如你说现象不符合,到底是怎样的不符合 ...

您好,你说的问题我以后一定注意。
然后,我的mian函数里面调用的是半字函数,也就是双字节的函数,具体如下
  1. int main(void)
  2. {
  3.         USART_Config();
  4.         Usart_SendHalfWord( DEBUG_USARTx,  0xff56);

  5.         while(1)
  6.         {       
  7.         }
  8. }
复制代码
这个时候,只有高位字节ff显示,低位字节56丢失。
在老师后面的教学中,发送数组时候,也是只能显示数组的第一个元素
回复 支持 反对

使用道具 举报

发表于 2022-3-9 09:49:23 | 显示全部楼层
野火论坛202203090949203327..png
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-9 16:01:12 | 显示全部楼层

大哥喝茶!
为什么我总是看不到,哭了
很感谢大哥每次的出手相助
话说大哥有usart的作业程序嘛?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 07:28 , Processed in 0.030890 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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