|
1、STM32103 USART1死机 ! p( c( a8 M: b( W0 l9 P& @# q: u" _ 问:void USART_Receive(USART_TypeDef* USARTx) {$ A% t7 C! @# c' ^ if (USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==SET) { USART_ClearFlag(USARTx,USART_FLAG_RXNE);2 u; I# Z# N; f$ _/ ?. B s[0]=USART_ReceiveData(USART1); delay(1000); f \0 T. Z8 Q# \ s[1]=USART_ReceiveData(USART1); ?6 o5 p% E: v8 A7 j delay(1000); s[2]=USART_ReceiveData(USART1); delay(1000);" F1 V+ A" `7 |+ l write_char(s[0],s[1],s[2]); //发送数据到PC ; b1 R7 ~% t3 x1 }! Q //if(s[0]==0xff){GPIO_WriteBit(GPIOE,GPIO_Pin_0,Bit_SET);} // //write_char(s[0],s[1],s[2]); // query_uart_command(); //命令判断 } }+ F+ Z$ ?2 E% i7 h. V/ t7 ^ 上面程序在 发送FF的时候收到FF FF FF 发送FF 22的时候收到FF 22 22 发送FF 22 33时收到FF 22 22" x9 v+ ]! b, d$ G 之后再发送数据时串口不响应!!! 答1:你这个程序,你收到第一个字节后,清标志,然后等待接后后面两个没有清标志。这也和两次发送时间 间隔有关 答2:stm32串口有个可以说是bug的地方,就是即使不使能溢出等其他错误中断的情况下,若发生溢出错误,仍会进入中断,而且常规检查中断的方法无法查到中断标志。所以办法就是在串口正常中断处理之后加清除中断的语句。具体网上可以找到。之前因为这个原因,程序经常死掉,结果是死在串口中断处理里,不停中断,有没有清除中断标志哦。" f7 @! f P) W8 [3 W5 h7 b : \* M/ P" s2 q- t+ X 2、STM32F207的串口问题 问:使用官方提供的串口例程时,定义串口2~5都没有问题。使用串口1或串口6时,无数据输出。TXD线上只是低电平。求解。。。。 * Q, P) [ [6 D. V( F5 v 附上代码。 串口2~5,先提供官方例程 (例程链接:https://www.stmcu.org.cn/wall/index.php?act=read&id=5856) 按照上面的例程,将串口3改为串口1后,串口1不能工作,TXD线上是低电平, 仿真时发现,程序停留在 while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TXE) == RESET) 0 {5 u. v% N1 B7 h" n { ! W% e' {8 ?; i8 K } 这个地方。 9 m+ P4 v( w0 u. p Z# {$ w3 d 串口1的引脚定义是PA.09,PA.10 5 I- I) J I1 J+ H$ B, B1 S 2 t/ h C$ f: P1 b 答1:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE) for USART1 and USART6 * RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE) for USART2, USART3, UART4 or UART5. *6 O t. y" Z$ z$ r % ]8 V: C( `& {+ }. g3 m 3、stm32中的串口通信中的USART_WordLength,数据位的长度包不包括开始位哪些? 问:stm32中的串口通信中的USART_WordLength,数据位的长度包不包括开始位哪些?0 ?4 }" P: [1 d) w 答:不包括开始位,如果你有 校验(奇 偶)的话,数据位是包括校验位的。USART_WordLength 这个是可以设 9 % s. H6 k! c' j* U' f2 R 4、stm32的DMA 到usart8 p/ R+ y3 N- b 问:把一个数组的数据传输到USART。设为Circular时,DMA是不是会自动不停的传输数据?既是main函数里没有调用传输,DMA也会不停把数组的数据传给USART?不受main控制?DMA数据传输还是受CPU的控制的?需要认为的调用?2 Y" B2 A% |% _0 a 答:设置成循环的只是说当数据传输量寄存器里面的内容变为零会重新加载,然后重新传输,但是这一切前提都是进行了设置和使能(这里应该是DMA请求,我还没看出来别的使能方式,正在学习呵呵),但是记住只有再怎么写好设置的子函数或者说模块,如果没有main里调用,不会运行的,因为单片机只执行MAIN里的函数,如果没有调用语句,是不会自己跑到DMA设置子函数里的,也就是说不会不断执行。人为调用,设置一下各个寄存器,有传输的来源和目的设置有传输数据量设置等等,设置完了,开启就可以了,CPU可以去干别的,看一下参考手册就知道了。& r% a$ _6 B) {( H/ c1 _$ H . L& K2 K- Y n 5、STM32串口接收程序 6 L! J! ?, E" c9 k 问:在STM32串口接收程序里 USART_GetFlagStatus(USART1,USART_FLAG_ORE)==RESET 这句语句是什么意思?. [0 ] S; T; q9 o9 U# j$ l/ b 答:查寻串口标志,为0还是1,reset 为0,set 为1,还有清除标志位的作用 5 |, R' m' i9 J5 J 6、STM32F10XX系列SPI和USART区别 问:STM32F10XX系列SPI和USART区别?我想用USATR对SD卡进行读写是否可行?我用USART的同步方式跟SPI是一样的吗?我用的STM32中的USART可以接SPI设备,它是一个同步/异步收发器。我在看开发板时看到有开发板是用SPI对SD卡进行操作的。应该是用的SD卡的MMC/SPI模式。只是没有见到用它的USART读写SD卡的例子,不知道哪有这方面的资料。 答:请先SPI和USART都没有搞清楚,再搞用USATR对SD卡进行读写,我不知道你的sd卡是哪个型号,但是一般的存贮器件不会采用uart口的,SD卡是用来存储大容量数据的,读写数据在速度在要求快,而uart口的速度一般不会很快,你看看你的串口调试助手就知道了,上面有波特率,所以sd卡不会用uart口来读写的,再说了,用什么口来读写sd卡都是一样的,你只要按照datasheet 的命令格式给卡发送命令就可以操作它了,建议不要纠结这个问题!6 F( j$ _+ G3 ^+ n" m |
微信公众号
手机版
RE:STM32关于USART的问题集锦
RE:STM32关于USART的问题集锦
#include "stm32f10x_it.h"
#include"stdio.h"' ?9 \; i% ~: Y# R/ d8 @
#include "string.h"" A- A6 z3 z4 _& I8 V' o
static int j=0;
void USART1_IRQHandler(void)
{
int i=1,k,m,n=0,index=0;
0 Y% B* e+ G2 i& s
char str[6]="";0 p2 z! z# \" N( y/ X
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)// 如果是串口接收中断
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除USARTx的中断待处理位
USART_ClearFlag(USART1,USART_FLAG_TC); //清除标志位4 N6 g3 c+ e: v& `! P( O- H
if(USART_ReceiveData(USART1)!=' ')
{
str[j]=USART_ReceiveData(USART1); // 将接收到的字节发送出去1 R/ }# C- X0 k9 W' P& I! T& o% g6 Q1 H B
j++; ) D! [+ K1 a* q2 q7 ?( O S
}
if(USART_ReceiveData(USART1)==' ')! k. e! e; ]- A6 }
{5 f0 e! P, d% v3 J2 Q
m=strlen(str);
for(j=0;j
回复:STM32关于USART的问题集锦
RE:STM32关于USART的问题集锦