stm32串口实验:stm32通过usart1进行串口收发PA9(TX)和PA10(RX)_第1页
stm32串口实验:stm32通过usart1进行串口收发PA9(TX)和PA10(RX)_第2页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 stm32串实验: stm32通过 usart1进串收发, PA9(TX)和 PA10(RX)这是stm32开发中较简单的实验,原理是通过串助发送信息,stm32接收到信息以后在串助中打印相同的内容。这直接分享keil5程代码,是在程模板的基础上移植和修改了正点原的串代码(如果失效的话可以在下评论留下邮箱,我看到会给你发份)顺便把usart.c和usart.h还有mian.c中的代码复制到下,伙伴可以直接移植到的程中实现的效果也在下放上串助中显的图usart.c1 #include sys.h2 #include usart.h345 /STM32F103核板例程6 /库函数版本例程7 /*

2、 出品 */8910 /11 /如果使ucos,则包括下的头件即可.12 #if SYSTEM_SUPPORT_UCOS13 #include includes.h14 #endif/ucos 使15 /16 /STM32开发板17 /串1初始化1819 /202122 /23 /加以下代码,持printf函数,不需要选择use MicroLIB24 #if 125 #pragma import(_use_no_semihosting)26 /标准库需要的持函数27 struct _FILE28 29 int handle;3031 ;3233 FILE _stdout;34 /定义_sys_

3、exit()以避免使半主机模式35 void _sys_exit(int x)36 37 x = x;38 39 /重定义fputc函数40 int fputc(int ch, FILE *f)41 42 while(USART1-SR&0X40)=0);/循环发送,直到发送完毕43 USART1-DR = (u8) ch;44 return ch;45 46 #endif4748 /*使microLib的法*/49 /*50 int fputc(int ch, FILE *f)51 52 USART_SendData(USART1, (uint8_t) ch);5354 while (USA

4、RT_GetFlagStatus(USART1, USART_FLAG_TC) = RESET) 5556 return ch;57 58 int GetKey (void) 5960 while (!(USART1-SR & USART_FLAG_RXNE);6162 return (int)(USART1-DR & 0 x1FF);63 64 */6566 #if EN_USART1_RX /如果使能了接收67 /串1中断服务程序68 /注意,读取USARTx-SR能避免莫名其妙的错误69 u8 USART_RX_BUFUSART_REC_LEN; /接收缓冲,最USART_REC_LEN

5、 个字节.70 /接收状态71 /bit15, 接收完成标志72 /bit14, 接收到0 x0d73 /bit130, 接收到的有效字节数74 u16 USART_RX_STA=0;75/接收状态标记 76 void uart_init(u32 bound)77 /GPIO端设置78 GPIO_InitTypeDef GPIO_InitStructure;79 USART_InitTypeDef USART_InitStructure;80 NVIC_InitTypeDef NVIC_InitStructure;8182 RCC_APB2PeriphClockCmd(RCC_APB2Peri

6、ph_USART1|RCC_APB2Periph_GPIOA, ENABLE);/使能USART1,GPIOA时钟83/USART1_TX PA.984 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;/PA.985 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;86 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /复推挽输出87 GPIO_Init(GPIOA, &GPIO_InitStructure);8889 /USART1_RXPA.1090 GPIO

7、_InitStructure.GPIO_Pin = GPIO_Pin_10;91 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/浮空输92 GPIO_Init(GPIOA, &GPIO_InitStructure);9394 /Usart1 NVIC 配置9596 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;97 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 3 ;/抢占优先级398 NVIC_InitStructur

8、e.NVIC_IRQChannelSubPriority = 3;99 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/优先级3/IRQ通道使能100 NVIC_Init(&NVIC_InitStructure); /根据指定的参数初始化VIC寄存器101102 /USART 初始化设置103104 USART_InitStructure.USART_BaudRate = bound;/般设置为9600;105 USART_InitStructure.USART_WordLength = USART_WordLength_8b; /字长为8位数据

9、格式106 USART_InitStructure.USART_StopBits = USART_StopBits_1;/个停位107 USART_InitStructure.USART_Parity = USART_Parity_No;/奇偶校验位108 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /硬件数据流控制109 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /收发模式110111 USA

10、RT_Init(USART1, &USART_InitStructure); /初始化串112 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);/开启中断113 USART_Cmd(USART1, ENABLE);/使能串114115 116117118119 void USART1_IRQHandler( void)/串1中断服务程序120121 u8 Res;122 #ifdef OS_TICKS_PER_SEC123 OSIntEnter();124 #endif/如果时钟节拍数定义了,说明要使ucosII了.125 if(USART_GetI

11、TStatus(USART1, USART_IT_RXNE) != RESET) /接收中断(接收到的数据必须是0 x0d 0 x0a结尾)126127128129130131132133134135136137138139140141142143144145146147Res =USART_ReceiveData(USART1);/(USART1-DR); /读取接收到的数据if(USART_RX_STA&0 x8000)=0)/接收未完成if(USART_RX_STA&0 x4000)/接收到了0 x0dif(Res!=0 x0a)USART_RX_STA=0;/接收错误,重新开始else

12、 USART_RX_STA|=0 x8000; /接收完成了else /还没收到0X0Dif(Res=0 x0d)USART_RX_STA|=0 x4000;elseUSART_RX_BUFUSART_RX_STA&0X3FFF=Res ;USART_RX_STA+;if(USART_RX_STA(USART_REC_LEN- 1)USART_RX_STA=0;/接收数据错误,重新开始接收148 #ifdef OS_TICKS_PER_SEC149 OSIntExit();150 #endif/如果时钟节拍数定义了,说明要使ucosII了.151 152 #endifusart.h1 #ifn

13、def _USART_H2 #define _USART_H3 #include stdio.h4 #include sys.h56 /STM32F103核板例程7 /库函数版本例程 8 /* 出品 */910 /11 /STM32开发板12 /串1初始化1314 #define USART_REC_LEN15 #define EN_USART1_RX16200 /定义最接收字节数 200/使能(1)/禁(0)串1接收117 extern u8 USART_RX_BUFUSART_REC_LEN; /接收缓冲,最USART_REC_LEN 个字节.末字节为换符18 extern u16 USA

14、RT_RX_STA; /接收状态标记19 /如果想串中断接收,请不要注释以下宏定义20 void uart_init(u32 bound);21 #endifmain.c1 #include sys.h2 #include delay.h3 #include usart.h45 uint8_t t;6 uint8_t len;7 uint16_t times=0;89 int main(void)10 11 delay_init(); /延时函数初始化12 uart_init(115200); /串初始化为1152001314 while(1)1516171819202122232425262728293031323334 if(USART_RX_STA&0 x8000) /USART_RX_STA第六位为1则括号内为1,表接收完数据len=USART_RX_STA&0 x3fff;/得到此次接收到的数据长度printf(rn您发送的消息为:rnrn);for(t=0;tlen;t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论