实现功能:
初始化三个串口,调用两个,一个串口发送一个串口接收
串口数据接收除接收数据外还需给出帧有效数据字节长度;
串口可使用USART1、USART2、USART3,串口参数能自由设置;
实现不定长数据帧的串口收发
设计思路及流程:
将中断串口参数设置初始化,中断函数的处理写在USART.C 文件里面,再使用主函数文件进行调用。
1. 建立usart.c usart.h 文件
3个串口的串口参数能自由设置,结构体初始化
Usart1:
Usart2:
Usart3:
中断函数编写:
定义中断函数数组
串口一中断函数;
if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)//
接收中断,每接收一个字节(8位二进制数据),中断一次,每次中断(即每接收一个数据)都执行一次下列程序
串口二中断函数;
串口三中断函数;
字符串处理函数:
Usaert.h
设置最大接收字节数,使能串口
2.主函数实现:
Main.c
包含头文件,定义数组
定义变量,延时,串口初始化
While 循环内 设置数组长度length每次接收到一个字节的数据后usart1_in++,
2. 实际功能实现任意两个串口收发
引脚设置: PA9 USART1_TX
PA10 USART1_RX
发送串口修改选择箭头所示的串口名,可以修改为USART2,USART3
到目前为止这种方法编写的程序只能进入debug模式进行演示,还必须得分步调试,其它串口才能收到,如图所示
话不多说,直接上代码
串口二接收情况
串口三接收情况
完整代码
USART.C
#include "sys.h"
#include "usart.h"
#include #include #if SYSTEM_SUPPORT_UCOS #include "includes.h" #endif #if 1 #pragma import(__use_no_semihosting) //±ê×¼¿âÐèÒªµÄÖ§³Öº¯Êý struct __FILE { int handle; }; FILE __stdout; //±ÜÃâʹÓðëÖ÷»úģʽ _sys_exit(int x) { x = x; } //Öض¨Òåfputcº¯Êý int fputc1(int ch, FILE *f) { while((USART1->SR&0X40)==0);//Ñ»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï USART1->DR = (u8) ch; return ch; } int fputc2(int ch, FILE *f) { while((USART2->SR&0X40)==0);//Ñ»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï USART2->DR = (u8) ch; return ch; } int fputc3(int ch, FILE *f) { while((USART3->SR&0X40)==0);//Ñ»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï USART3->DR = (u8) ch; return ch; } #endif #if EN_USARTx_RX //Èç¹ûʹÄÜÁ˽ÓÊÕ //´®¿Ú1ÖжϷþÎñ³ÌÐò u8 USART_RX_BUF[USART_REC_LEN]; //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú. //½ÓÊÕ״̬ //bit15£¬ ½ÓÊÕÍê³É±êÖ¾ //bit14£¬ ½ÓÊÕµ½0x0d //bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿ u16 USART_RX_STA=0; //½ÓÊÕ״̬±ê¼Ç void usart1_init(u32 bound) { //GPIO¶Ë¿ÚÉèÖà GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//ʹÄÜUSART1£¬GPIOAʱÖÓÒÔ¼°¸´Óù¦ÄÜʱÖÓ //USART1_TX PA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö GPIO_Init(GPIOA, &GPIO_InitStructure); //USART1_RX PA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë GPIO_Init(GPIOA, &GPIO_InitStructure); //Usart1 NVIC ÅäÖà NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//ÇÀÕ¼ÓÅÏȼ¶1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //×ÓÓÅÏȼ¶0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷ //USART ³õʼ»¯ÉèÖà USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ USART_InitStructure.USART_StopBits = USART_StopBits_2;//Ò»¸öֹͣλ 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(USART1, &USART_InitStructure); //³õʼ»¯´®¿Ú // USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//ʹÄÜÖÐ¶Ï USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆôÖÐ¶Ï USART_Cmd(USART1, ENABLE); //ʹÄÜ´®¿Ú } void usart2_init(u32 bound) { //GPIO¶Ë¿ÚÉèÖà GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_AFIO, ENABLE); //ʹÄÜUSART2£¬GPIOAʱÖÓÒÔ¼°¸´Óù¦ÄÜʱÖÓ //USART2_TX PA.2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö GPIO_Init(GPIOA, &GPIO_InitStructure); //USART2_RX PA.3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);//¸¡¿ÕÊäÈë //Usart2 NVIC ÅäÖà NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//ÇÀÕ¼ÓÅÏȼ¶1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //×ÓÓÅÏȼ¶0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷ //USART ³õʼ»¯ÉèÖà USART_InitStructure.USART_BaudRate =115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ USART_InitStructure.USART_StopBits = USART_StopBits_2;//Ò»¸öֹͣλ 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); //³õʼ»¯´®¿Ú // USART_ITConfig(USART2, USART_IT_TXE, ENABLE);//ʹÄÜÖÐ¶Ï USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//¿ªÆôÖÐ¶Ï USART_Cmd(USART2, ENABLE); //ʹÄÜ´®¿Ú } void usart3_init(u32 bound) { //GPIO¶Ë¿ÚÉèÖà GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//ʹÄÜUSART1£¬GPIOAʱÖÓÒÔ¼°¸´Óù¦ÄÜʱÖÓ //USART3 _TX PA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö GPIO_Init(GPIOA, &GPIO_InitStructure); //USART1_RX PA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë GPIO_Init(GPIOA, &GPIO_InitStructure); //Usart3 NVIC ÅäÖà NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//ÇÀÕ¼ÓÅÏȼ¶1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //×ÓÓÅÏȼ¶0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷ //USART ³õʼ»¯ÉèÖà USART_InitStructure.USART_BaudRate = 115200;//Ò»°ãÉèÖÃΪ115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ USART_InitStructure.USART_StopBits = USART_StopBits_2;//Ò»¸öֹͣλ 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(USART1, &USART_InitStructure); //³õʼ»¯´®¿Ú // USART_ITConfig(USART3, USART_IT_TXE, ENABLE);//ʹÄÜÖÐ¶Ï USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//¿ªÆôÖÐ¶Ï USART_Cmd(USART3, ENABLE); //ʹÄÜ´®¿Ú } /* ***************************************ÖжϺ¯Êý ********************************************************/ #define TxBufferSize1 (countof(TxBuffer1)-1) #define TxBufferSize2 (countof(TxBuffer2)-1) #define TxBufferSize3 (countof(TxBuffer3)-1) #define RxBufferSize1 (countof(TxBuffer1)-1) #define RxBufferSize2 (countof(TxBuffer2)-1) #define RxBufferSize3 (countof(TxBuffer3)-1) #define countof(a) (sizeof(a)/sizeof(*(a))) //±íʾÊý×éaÖеÄÔªËظöÊý char TxBuffer1[27]=""; char TxBuffer2[27]=""; char TxBuffer3[27]=""; char RxBuffer1[RxBufferSize1]; char RxBuffer2[RxBufferSize2]; char RxBuffer3[RxBufferSize3]; __IO uint8_t TxCounter1 = 0; __IO uint8_t TxCounter2 = 0; __IO uint8_t TxCounter3 = 0; __IO uint8_t RxCounter1 = 0; __IO uint8_t RxCounter2 = 0; __IO uint8_t RxCounter3 = 0; uint8_t NbrOfDataToTransfer1 = TxBufferSize1; uint8_t NbrOfDataToTransfer2 = TxBufferSize2; uint8_t NbrOfDataToTransfer3 = TxBufferSize3;
上一篇:STM32F103C8T6学习笔记_串口USART的使用
下一篇:stm32f103之串口实验
推荐阅读
史海拾趣
机顶盒,全称为数字视频变换盒,是连接电视机与外部信号源的关键设备,具备高度的专业性和广泛的科普意义。从广义上讲,任何与电视机连接的网络终端设备均可称为机顶盒,包括传统的模拟频道增补器到现代的数字卫星机顶盒、有线电视数字机顶盒及IPTV机顶盒等。其主要功能在于接收来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,并将这些信号转换为电视机可识别的视频和音频格式,极大地丰富了用户的观看选择,提升了观看体验。
机顶盒不仅能提供高清、4K甚至超高清的电视节目,还具备网络交互功能,用户可通过机顶盒连接互联网,享受在线购物、观看网络视频、玩游戏等多元化服务。此外,机顶盒还支持电子节目指南、因特网网页浏览等增值服务,使电视机不再仅仅是接收信息的单向设备,而是成为与用户进行互动的智能终端。
随着技术的不断进步,机顶盒正朝着高清化、智能化、多功能化方向发展。例如,通过智能推荐算法,机顶盒能为用户提供个性化的节目推荐;借助语音识别技术,用户可通过语音指令控制机顶盒,实现便捷操作。未来,机顶盒将继续融合新技术,如人工智能、云计算等,为用户提供更加丰富的娱乐选择和更加智能的观看体验。
品牌建设是公司发展的重要一环。Cables To Go公司注重品牌形象的塑造和传播,通过参加行业展会、举办产品发布会等方式提升品牌知名度。同时,公司还积极参与社会公益活动,展现企业的社会责任感和担当精神。这些举措有效地提升了Cables To Go的品牌形象和影响力,为公司的长期发展奠定了坚实的基础。
随着业务的不断扩展,GradConn意识到全球化布局的重要性。公司不仅在台湾设立总部,还在英国和美国建立了生产设施,并通过遍布160个国家的销售和分销网络,为客户提供全方位的支持。这种全球化布局不仅提升了GradConn的市场竞争力,还使其能够更好地服务全球客户,确保产品能够及时、准确地送达世界各地。
为了进一步扩大市场份额,Cynergy 3制定了国际化发展战略。公司积极参加国际展会和会议,与全球各地的客户和合作伙伴建立联系。同时,Cynergy 3还在全球范围内设立了多个分支机构和服务中心,以便更好地为客户提供服务。这些努力使得Cynergy 3的产品逐渐进入了国际市场,并赢得了众多国际客户的青睐。
随着业务的不断发展,川土微电子开始在全国范围内进行战略布局。公司不仅在上海设立了总部和研发中心,还在其他地区设立了办事处和生产基地。此外,川土微电子还积极与多家封测厂合作建立了封测专线,确保了产品的质量和供应的稳定性。
随着业务的不断发展,川土微电子开始在全国范围内进行战略布局。公司不仅在上海设立了总部和研发中心,还在其他地区设立了办事处和生产基地。此外,川土微电子还积极与多家封测厂合作建立了封测专线,确保了产品的质量和供应的稳定性。
提供各种各样得synopsys & cadence & mentor & magma 等 有ASIC设计的digital & analog IP可以提供,如需要可email联系-8bit 1T/2T/4T/12T MCU 8bit RISC CPU 16bit MCU 32ibt RISC CPU Audio Echo Processor 16/24 bit DSP Core - Interface IP: Usb1.0 controll ...… 查看全部问答∨ |
|
ISD4004语音系列芯片是美国ISD公司推出的产品,具有可多次重复录放、存储时间长、使用时不需扩充存储器、所需外围电路简单等特点。介绍了ISD4004芯片在语音报站器中的一个实际应用,并说明了其功能和使用方法,从而使读者对ISD ...… 查看全部问答∨ |
摘要: 在FPGA片内实现全数字锁相环用途极广。本文在集成数字锁相环74297的基础上进行改进,设计了锁相状态检测电路,配合CPU对环路滤波参数进行动态智能配置,从而使锁相环快速进入锁定状态,在最短时间内正常工作并且提高输出频率的质量。 关键词 ...… 查看全部问答∨ |
verilog里面count=count+1;的硬件电路是什么样子的? 用到add模块了是吗? 最后面的1 是如何做的? 如果用count<=count+1; 会有什么不同呢? 我知道一个是 阻塞的 一个是非阻塞的。我问的是实际效果?会导致不期望的逻辑错误吗?… 查看全部问答∨ |
|
谁有PIC单片机上韦根的接收程序,发我参考下,多谢了。。我自己也写了个是用数组来接收的,不过用不起来。。。 要是C语言的哦。。最好是整个的,包括中断什么的。。。 E-mail:shanligang@vip.qq.com… 查看全部问答∨ |
|