首页 > 编程知识 正文

stm32f103有多少个串口,stc15l2k32s2引脚图

时间:2023-05-04 02:29:00 阅读:174091 作者:4236

STM32F103系列_串行端口Usart收发函数常见问题解答:串行端口的第一个字节丢失了吗? 串行端口不稳定? 串行调用英文数字也没关系,中文会乱码吗? 麦片和粗犷的可乐相撞,会上钩吗? 代码Usart.cUsart.h的用法

常见问题解答:没有串行端口的第一个字节吗?

解决方法:读取USARTx-SR可以避免在首次发送数据时丢失开头。

串行端口不稳定? 解决方案:传输线路不要过长,传输接口不要松动,传输线路附近不要有大的干扰源。

串行调用英文数字也没关系,中文会乱码吗? 解决方案:关闭项目,在项目目录中找到main.c,在记事本中打开,选择“文件”“另存为”,将ANSI代码修改为“UTF-8”,并替换为原始main.c

麦片和粗犷的可乐相撞,会上钩吗? 解决方案:通过串行端口中断。

通过代码usart.c # include ' STM 32 F10 x.h '//c库链接将半主机上的函数# pragma import (_ _ use _ no _ semi hosting ) /标准库FILE __stdout; //半托管模式void_sys_exit(intx ) ) x=x; 重新定义fputc函数intfputc(intch,FILE *f ) (ifen _ usar t1 _ rx while ((usar t1-sr0x 40 )==0) ); //USART1-dr=(U8 )在发送完成之前循环发送ch; # endif # ifen _ usar T2 _ rx while ((usar T2-sr0x 40 )==0); //USART2-dr=(U8 )在发送完成之前循环发送ch; #endifreturn ch; }#if EN_USART1_RX //串行1的接收//串行1中断服务程序//如果注意已启用,则通过读取USARTx-SR来读取莫名其妙的错误u8 usar t1 _ rx _ rx _注意//接收缓冲区、最大USART_REC_LEN字节.//接收状态//bit15、接收完成标志//bit14、0x0d//bit13~0、接收有效字节数(u16 usar t1 _ ren ) usart _ inittypedefusart _ init structure; nvic _ inittypedefnvic _ init structure; RCC _ AP B2 periphclockcmd (RCC _ AP B2 per iph _ usar t1|RCC _ AP B2 per iph _ gpioa,ENABLE ); 启用USART1,并输入GPIOA时钟//usar t1 _ txgpioa.9 gpio _ init structure.gpio _ pin=gpio _ pin _ 9; gpio _ init structure.gpio _ speed=gpio _ speed _ 50m Hz; gpio _ init structure.gpio _ mode=gpio _ mode _ af _ PP; //复用推挽输出gpio_init(gpioa,GPIO_InitStructure ); //gpioa.9//usar t1 _ rxgpioa.10g Pio _ init structure.gpio _ pin=gpio _ pin _ 10; //pa 10g Pio _ init structure.gpio _ mode=gpio _ mode _ in _ floating; //浮动输入gpio_init(gpioa,GPIO_InitStructure ); GPIOA.10//Usart1 NVIC配置nvic _ init structure.nvic _ IRQ channel=usar t1 _ irqn; nvic _ init structure.nvic _ irqchannelpreemptionpriority=2; //抢占优先级2n vic _ init structure.nvic _ irqchannelsubpriority=0; //子优先级0 nvic _ init structure.nvic _ irqchannelcmd=enable; //IRQ信道使能NVIC_init(NVIC_initstructure ); //根据指定参数设置VIC寄存器//USART初始化设置usart _ init structure.usart _ baudrate=bound; //串行端口速率usart _ init structure.usart _ word length=usart _ word length _ 8b; //字长为8位数据格式usart _ init structure.usart _ stop bits=usart _ stop bits _ 1;//一个停止位usart _ init structure.usart _ parity=usart _ parity _ no; //无奇偶校验usart _ init structure.usart _ hardware flow control=usart

_HardwareFlowControl_None; //无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启串口接受中断USART_Cmd(USART1, ENABLE); //使能串口1}void USART1_IRQHandler(void) //串口1中断服务程序{u8 Res;if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res = USART_ReceiveData(USART1); //读取接收到的数据if ((USART1_RX_STA & 0x8000) == 0) //接收未完成{if (USART1_RX_STA & 0x4000) //接收到了0x0d{if (Res != 0x0a)USART1_RX_STA = 0; //接收错误,重新开始elseUSART1_RX_STA |= 0x8000; //接收完成了}else //还没收到0X0D{if (Res == 0x0d)USART1_RX_STA |= 0x4000;else{USART1_RX_BUF[USART1_RX_STA & 0X3FFF] = Res;USART1_RX_STA++;if (USART1_RX_STA > (USART_REC_LEN - 1))USART1_RX_STA = 0; //接收数据错误,重新开始接收}}}}}#endif#if EN_USART2_RX //如果使能了串口2的接收//串口2中断服务程序//注意,读取USARTx->SR能避免莫名其妙的错误u8 USART2_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.//接收状态//bit15,接收完成标志//bit14,接收到0x0d//bit13~0,接收到的有效字节数目u16 USART2_RX_STA = 0; //接收状态标记void Usart2_Init(u32 bound){GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;USART_InitTypeDef USART_InitStructure;;RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA, ENABLE); //使能USART2,GPIOA时钟//USART2_TX GPIOA.2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2//USART2_RX GPIOA.3GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.3//Usart2 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式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(USART2, &USART_InitStructure);//初始化串口2USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //开启串口接收中断USART_Cmd(USART2, ENABLE); //使能串口2}void USART2_IRQHandler(void) //串口2中断服务程序{u8 Res;if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res = USART_ReceiveData(USART2); //读取接收到的数据if ((USART2_RX_STA & 0x8000) == 0) //接收未完成{if (USART2_RX_STA & 0x4000) //接收到了0x0d{if (Res != 0x0a)USART2_RX_STA = 0; //接收错误,重新开始elseUSART2_RX_STA |= 0x8000; //接收完成了}else //还没收到0X0D{if (Res == 0x0d)USART2_RX_STA |= 0x4000;else{USART2_RX_BUF[USART2_RX_STA & 0X3FFF] = Res;USART2_RX_STA++;if (USART2_RX_STA > (USART_REC_LEN - 1))USART2_RX_STA = 0; //接收数据错误,重新开始接收}}}}}#endif Usart.h #ifndef _USART_H__#define _USART_H__#include "stm32f10x.h"#include "STM32F103C6T6.h"#define USART_REC_LEN 200 //定义最大接收字节数 200#define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收#define EN_USART2_RX 0 //使能(1)/禁止(0)串口2接收extern u8 USART1_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符extern u16 USART1_RX_STA; //接收状态标记extern u8 USART2_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符extern u16 USART2_RX_STA; //接收状态标记void Usart1_Init(u32 bound);void Usart2_Init(u32 bound);#endif 使用方法

1、在mian函数里调用Usart.h头文件,初始化串口1波特率为115200:Usart1_Init(115200);
2、printf("%d",123456)或printf(“123456”),串口打印123456;
3、printf("%d",abcdefg)或printf(“abcdefg”),串口打印abcdefg;
4、printf(“你好”),串口打印“你好”;
4、printf("rn"),串口输出回车换一行;

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。