历史上的今天
今天是:2024年09月05日(星期四)
2019年09月05日 | STM32串口通信(一)
2019-09-05 来源:eefocus
关于STM32串口通信USART的一些个人浅见:
1:对STM32中文数据手册解读之后,相信大家对USART串行通信有些了解,学习51的时候也都接触过,使用串口只要弄明白原理就很简单了
发送和接收数据的过程从图上可以直观的看出

USART串口通信涉及到几个重要的寄存器
1:)状态寄存器

2)数据寄存器

3)波特比率寄存器


例:若要设置比特率为9600,那么DIV就是468.75,则此寄存器的高12位应存值:468,低4位存值:0.75*16=12(十进制小数换算成十六进制小数);最后将整数和小数拼接:BRR=468<<4+12;(详细过程可参照源代码;)
4)控制寄存器1:


5)控制寄存器2:
主要配置停止位,时钟极性,时钟使能
6)控制寄存器3:
涉及到硬件流控制,DMA配置等
发送数据:

接收数据:

相关程序:
中断函数:
void USART1_IRQHandler(void)
{
static u8 ch;
USART_ClearFlag(USART1 , USART_FLAG_TC);
if(USART_GetITStatus(USART1, USART_IT_RXNE) != Bit_RESET)
{
ch=USART_ReceiveData(USART1);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == Bit_RESET); USART_SendData(USART1, ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC));
}
}
主程序:
int main()
{
usart_init();
while(1);
}
配置程序:
void usart_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_DeInit(USART1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);
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);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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_Tx | USART_Mode_Rx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
USART_ITConfig (USART1,USART_IT_RXNE,ENABLE);
USART_ClearFlag(USART1,USART_FLAG_TC);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
(以上内容均为个人浅见,如有不恰之处,请指正,谢谢!)
上一篇:STM32输入捕获(一)
下一篇:STM32外部中断笔记(一)
史海拾趣
|
http://www.e8page.cn/shtml/xiaohua_523_1400.html 呵呵, 2008年12月14日,伊拉克记者扎伊迪在招待会上向布什扔出自己的鞋子,并高声辱骂布什。凭借此举扎伊迪一夜成名,成为整个阿拉伯世界的“斗士”。 不失时机的游戏开发者们立刻制作这款F ...… 查看全部问答> |
|
想做一个在搜索对话框弹出时自动跳出软键盘的功能 想用SipEnumIM获取输如法信息 然后用取得的CLSID值调用SipSetCurrentIM设置当前输入法信息 最后用SipShowIM显示输入法的软键盘, 不会写api相关的代码,向大家请教,… 查看全部问答> |
|
为什么我的中断方式的TWI总线的双机通讯(两片MEGA48)在proteus下仿真时数据是正确的,下载到单片机时,接收到的数据就不正确呢,TWI波特率50K,100K,20K都试过,现象一样。 主机发送00~FF,从机收到的是00,02,04,08,10,12。。。。。。。 搞不懂啊 ...… 查看全部问答> |
|
2812搜查令+TMS320F2812 SCI口FLASH编程操作指南 TMS320F2812 SCI口FLASH编程操作指南 对于掌握编程很有帮助 [ 本帖最后由 hangsky 于 2011-11-8 13:37 编辑 ]… 查看全部问答> |
|
因为各种的需要,有时可能需要在单片机上开根号。下面是在网上找到的方法,与大家分享。 1.原理 用pow(X,Y)表示X的Y次幂,用B[0],B[1],...,B[m-1]表示一个序列, 其中[x]为下标。 假设: B[x],b[x]都是二进制序 ...… 查看全部问答> |




