用UART写了一段Bootloader代码,遇到了一个很奇怪的现象。

代码如下:简单介绍一下就是先统一配置MCU的IO端口,然后配置串口参数,然后循环发送‘0’和'\r’。16进制是0x30 0x0d

int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);RCC_HSE_Configuration();//外部高速时钟初始化SysTick_Init();IO_Init();//初始化板子端口Uart_Init(115200);//初始化串口while (1)/* Infinite loop */{UART_SendByte( '0');UART_SendByte('\r');Delay(1000);}
}void IO_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置 USART1 Tx (PA.09) 作为功能引脚并上拉输出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_ResetBits(GPIOA, GPIO_Pin_9);//配置 USART1 Tx (PA.10) 作为功能引脚并是浮空输入模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);
}void Uart_Init(uint32_t Baud)
{USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);USART_InitStructure.USART_BaudRate = Baud;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);
//  USART_ClearFlag(USART1, USART_FLAG_TC);USART_Cmd(USART1,ENABLE);
}

结果下载完程序,运行后发送出来的第一字节是0x3f 然后才正常的0x30 0x0d,感觉很奇怪,花时间去测试。

尝试一:把串口的两个端口配置放在串口配置函数里,如下

void Uart_Init(uint32_t Baud)
{USART_InitTypeDef USART_InitStructure;GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);// 配置 USART1 Tx (PA.09) 作为功能引脚并上拉输出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//配置 USART1 Tx (PA.10) 作为功能引脚并是浮空输入模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitStructure.USART_BaudRate = Baud;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);
//  USART_ClearFlag(USART1, USART_FLAG_TC);USART_Cmd(USART1,ENABLE);
}

这样就正常了,上电就收到0x30 0x0d

尝试二:这样修改,把串口外设时钟在端口配置函数里面就打开。

void IO_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//这里提前打开串口外设时钟// 配置 USART1 Tx (PA.09) 作为功能引脚并上拉输出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_ResetBits(GPIOA, GPIO_Pin_9);//配置 USART1 Tx (PA.10) 作为功能引脚并是浮空输入模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);
} 

也是可以正常输出0x30 0x0d

总结:stm32的外设时钟应该在此外设端口配置之前打开。

转载于:https://www.cnblogs.com/IdeaMing/p/11462692.html

stm32f103c8串口USART1发送多一字节相关推荐

  1. stm32 usart 单线半双工串口 DMA发送 最后一个字节发不出来问题

    最近遇到一个小问题,感觉很有意思便记下来分享一下 ,顺便也为日后类似的问题提供点思路: 使用stm32串口发送数据 ,串口是单线半双工模式,要求数据发送前串口变成发送模式,发送完后立即变回接收模式,发 ...

  2. stm32+HTU21D温湿度传感器通过usart1发送温湿度数据在串口助手显示

    stm32+HTU21D温湿度传感器 这里就不拍实物图了,我用的是下面这款HTU21D ic是stm32f103vet6 工程代码是io口模拟i2c和传感器通讯 PB6-SCL,PB7-SDA usa ...

  3. 串口通信发送hello windows

    文章目录 一. 原理 1.串口协议 2.RS-232 3.485标准 4.RS232.485电平与TTL电平的区别 5."USB/TTL转232"模块(以CH340芯片模块为例)的 ...

  4. STM32F103C8串口通信与流水灯操作

    目录 一.串口协议和RS-232标准,RS232电平与TTL电平的区别,"USB/TTL转232"模块的工作原理 1.串口协议 2.RS-232标准 3.RS232.485电平与T ...

  5. delphi 串口通信发送_STM32第五章串口通讯详解

    点击上方"果果小师弟",选择"置顶/星标公众号"干货福利,第一时间送达! 串口通信是串行通信里面的异步方式.串行通信是相对于并行通信来说的.串口是一个事实存在的 ...

  6. 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  7. stm32中断优先级_浅谈STM32串口USART1的使用

    浅谈STM32串口USART1的使用 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范 ...

  8. 一个严谨的STM32串口DMA发送接收(1.5Mbps波特率)机制

    文章目录 1 前言 2 串口有必要使用DMA吗 3 实现方式 4 STM32串口使用DMA 5 串口DMA接收 5.1 基本流程 5.2 相关配置 5.3 接收处理 5.3 .1 接收数据大小 5.3 ...

  9. 基于STM32F103RCT6实现串口中断发送,使用环形队列

    文章目录 一.开发环境 二.串口中断发送原理 三.实验现象 四.完整源码 五.后记 一.开发环境 /************************************************** ...

最新文章

  1. Python的必学技术——Jupyter Notebook
  2. 支持向量机libsvm实战入门
  3. 面试题整理 1:将一个字符串转换为整数
  4. 数据结构之B树与B+树
  5. linux -- at命令
  6. sigmoid函数的数值稳定性
  7. 状压DP UVA 10817 Headmaster's Headache
  8. 软件测试个人感悟之测试用例的评审重点是什么?
  9. java 实现复制_在java中如何实现复制,粘贴,剪切
  10. HDU1273 漫步森林【水题】
  11. 1004 成绩排名 (20 分)—PAT (Basic Level) Practice (中文)
  12. JavaScript url 编码转换
  13. Matlab数据标准化——mapstd、mapminmax
  14. mac u盘重装系统(monterey)
  15. [Maven实战-许晓斌]-[第二章]-2.4设置HTTP代理
  16. 深空摄影系列教程(昴星团摄星队)笔记
  17. java.lang.NumberFormatException For input string 错误及解决办法
  18. 22个无版权限制的高清无码图库站
  19. 数据保护新愿景:欧盟GDPR十个误解与争议
  20. Pytorch 实践 —— 乳腺癌预测

热门文章

  1. 【Rust日报】2021-09-05 perseus:完全支持 SSR 和 SSG 的 Rust 高端前端开发框架
  2. Hard link and soft link in Linux
  3. cmd中文输入和显示问题
  4. RGB 无限立方体(高级版)
  5. 【论文阅读笔记】BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translati
  6. ERP、CRM、SCM、BPM、DSS... ...这10种主流的B端产品你都知道吗?
  7. matlab并行加路径,matlab parfor_matlab 添加到路径_matlab 分布式计算
  8. 帆软报表决策系统跨域登录
  9. java下载pdf_java实现文件下载..pdf
  10. 【总结】1396- 60+个 VSCode 插件,打造好用的编辑器