STM32 USART1一键下载电路

要想了解一键下载电路的工作过程,首先要了解STM32的几种启动模式。

ISP下载一般步骤

1) Boot0接3.3,Boot1接GND
2) 按复位按键,实现下载

程序执行的一般步骤

1)mcuisp/flymcu勾选“编程后执行”,发送命令直接从FLASH启动。
2)Boot0接GND,Boot1接任意,按一次复位。

​STM32的几种启动模式如下表所示:​
启动模式
从表中可知,我们想用串口下载代码,就要配置BOOT0为1,BOOT1为0,但是如果想让STM32一复位就运行代码,就要配置BOOT0为0,BOOT1配置为什么都可以,为了解决这个问题,我们可以设计一个电路,通过串口转USB芯片CH340G的DTR#和RTS#引脚的信号来控制一键下载电路,从而间接控制STM32的RESET和BOOT0引脚的信号,来达到通过串口一键下载和运行的效果,省去了购买仿真器的费用,下载程序也变得简单方便,一键下载电路如下图所示:​​
电路

串口下载软件选用的是MCUISP,通过串口的DTR和RTS信号来自动配置BOOT0和RESET信号,不需要用户手动切换它们的状态,直接串口软件自动控制,可以方便的下载代码。
打开 MCUISP,点击搜索串口,将自动找到电路板板载串口,在bps中选择波特率为460800,左下角选择:DTR的低电平复位,RTS 高电平进 BootLoader。再加载烧写文件。​​
这里写图片描述
在烧写程序以前,点击读器件信息将出现如下图所示的信息,说明电路板串口连接成功。
这里写图片描述
点击开始编程,程序开始烧写,烧写成功后会出现如下图所示信息,表明程序烧写成功。
这里写图片描述
接下来我们对整个过程作一个详细的分析:​
我们需要注意一点:CH340G上电后DTR#和RTS#都为高电平,在用MCUISP烧写软件时,我们在软件下方选择“DTR的低电平复位,RTS高电平进BootLoader”,CH340G IC在实际操作时引脚的变化为“DTR#拉高,RTS#拉低”,即软件设置和实际情况是取非的,相反的。
首先,mcuisp控制DTR输出低电平,则DTR#输出高,然后RTS置高,则RTS#输出低,这样Q3导通了,BOOT0被拉高,即实现设置BOOT0为1,同时Q2也会导通,STM32的复位脚被拉低,实现复位。然后,延时100ms后,mcuisp控制DTR为高电平,则DTR#输出低电平,RTS维持高电平,则RTS#继续为低电平,此时STM32的复位引脚,由于Q2不再导通,变为高电平,STM32结束复位,但是BOOT0还是维持为1,从而进入ISP模式,接着mcuisp就可以开始连接STM32,下载代码了,从而实现一键下载。​

DTR#和RTS#信号的时序图如下图所示:​
这里写图片描述
程序下载完毕后,如果设置了编程后执行,STM32会再次被复位,此时DTR#为高,RTS#为低,STM32复位后,DTR#设置为低,RTS#设置为高,那么Q2和Q3都不导通,此时,STM32重新开始启动后,检测到BOOT0为0,程序开始正常运行,一键下载至此就完成了。

另外一篇网络文章:
这里写图片描述
这里写图片描述
这里写图片描述

以下是一个简单的 STM32 USART1 程序,实现了串口发送和接收功能: ```c #include "stm32f4xx.h" void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; // 使能 USART1 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 使能 GPIOA 时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 配置 USART1 引脚 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStruct); // 将 PA9 和 PA10 引脚复用为 USART1_TX 和 USART1_RX GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); // USART1 配置 USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStruct); // 使能 USART1 USART_Cmd(USART1, ENABLE); // 配置 USART1 中断 NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); // 使能 USART1 接收中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); } void USART1_SendByte(uint8_t byte) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, byte); } void USART1_SendString(char* str) { while (*str) { USART1_SendByte(*str++); } } void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) { uint8_t byte = USART_ReceiveData(USART1); // 处理接收到的数据 } } int main(void) { USART1_Init(); while (1) { // 发送数据 USART1_SendString("Hello, world!\r\n"); // 延时 for (volatile int i = 0; i < 1000000; i++); } } ``` 以上代码实现了 USART1 的初始化、发送和接收功能。其中,`USART1_Init` 函数用于初始化 USART1,`USART1_SendByte` 函数用于发送一个字节数据,`USART1_SendString` 函数用于发送一个字符串,`USART1_IRQHandler` 函数用于处理 USART1 的接收中断。在 `main` 函数中,我们不断发送“Hello, world!”字符串,并进行一个简单的延时。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值