串口这个让我研究了两天。
STM的串口是USART是可以同步也可以异步,一般用异步。
可以看出 只有将串口拉低,才能进行传输。另外 串口传输是一位一位传的,可以通过中断函数判断。每发一位,中断一次。
程序里对串口操作
1、GPIO时钟使能,USART时钟使能
2、串口IO模式,一个模拟输入,一个复用推挽输出。
3、USARTinit: 96、n、8、1等设置
4、NVIC中断优先级
5、涉及的库函数:
RCC_APB2PeriphClockCmd()
GPIO_Init()
USART_Init()
USART_Cmd()
USART_ITConfig()
NVIC_Init(&NVIC_InitStructure)
USART_SendData()
USART_GetFlagStatus()
void USART1_IRQHandler (void)
USART_GetITStatus(
USART_ReceiveData()
6.通过研究发现,将DTR变为低电平,即可正常传输。
7、仔细研究分析后。每次下载程序后,需要设置DTR。(通过usb一键下载程序的原理。)
我在程序中设置串口的模拟输入为低电平,并不能改善此现象。接着我发现,此开发板下载程序为usb下载,ISP模式。
从原理图可知L2303的RTS控制B0,DTR控制RST.
我们要达到下载的目的,就必须先让RTS拉高B0(设置B0为1),然后再让DTR控制RST为低(STM32为低电平复位).然后再释放RTS为高(停止复位),然后再开始串口下载代码(此时B0可以为高,也可以为低).
DTR电平置低(-3--12V),复位(DTR接了RST)
RTS置高(+3-+12V),选择进入BootLoader(RTS接了B0)
...延时100毫秒
DTR电平变高(+3-+12V)释放复位(释放复位,但是此时B0为高,所以进入ISP模式)
开始连接...4, 接收到:1F (连接成功) 转自——正点原子
所以每次下载程序后,DTR都为低。
然而DTR为高时,数据终端就绪,才能进行传输。所以需要拉高DTR位。