历史上的今天
今天是:2024年09月24日(星期二)
2019年09月24日 | STM32F1x系列——串口通信
2019-09-24 来源:eefocus
一 在STM32F1x系列串口通信实验中,常用的寄存器有:
(1)USART_SR 状态寄存器
(2)USART_DR 数据寄存器
(3)USART_BRR 波特率寄存器
(4) USART_CR 使能位
二 串口操作相关的库函数(省略入口参数):
(1)void USART_Init() ; //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
(2)void USART_Cmd ; //使能串口
(3)void USART_ITConfig() ; //使能相关中断
(4)void USART_SendData() ; //发送数据到串口,DR
(5)uint16_t USART_ReceiveData() ; //接受数据,从DR读取接受到的数据
(6)FlagStatus USART_GetFlagStatus() ; //获取状态标志位
(7)void USART_ClearFlag() ; //清除状态标志位
(8)ITStatus USART_GetITStatus() ; //获取中断状态标志位
(9)void USART_ClearITPendingBit() ; //清除中断状态标志位
三 串口配置的一般步骤:
(1)串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd() ;
(2)串口复位:USART_DeInit() ; 这一步不是必须的
(3)GPIO端口模式设置:GPIO_Init() ; 模式设置为GPIO_Mode_AF_PP
(4)串口参数初始化:USART_Init() ;
(5)开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤):
NVIC_Init() ;
USART_ITConfig() ;
(6)使能串口:USART_Cmd() ;
(7)编写中断处理函数:USARTx_IRQHandler() ;
(8)串口数据的收发:
void USART_SendData() ; //发送数据到串口,DR
uint16_t USART_ReceiveData() ; //接受数据,从DR读取接受到的数据
(9)串口传输状态获取:
FlagStatus USART_GetFlagStatus(RT_FLAUSART_TypeDef * USARTx , uint16_t USART_FLAG) ;
void USART_ClearITPendingBit(RT_FLAUSART_TypeDef * USARTx , uint16_t USART_IT) ;
程序中的main.c文件 代码如下:
#include "stm32f10x.h"
void My_USART1_Init()
{
GPIO_InitTypeDef GPIO_InitStruct ;
USART_InitTypeDef USART_InitStruct ;
NVIC_InitTypeDef NVIC_InitStruct ;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE) ; //GPIO时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE) ; //´串口时钟使能
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP ; //GPIO端口模式设置
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 ;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz ;
GPIO_Init(GPIOA,&GPIO_InitStruct) ;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING ; //GPIO端口模式设置
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 ;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz ;
GPIO_Init(GPIOA,&GPIO_InitStruct) ;
USART_InitStruct.USART_BaudRate = 115200 ;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ;
USART_InitStruct.USART_Parity = USART_Parity_No ;
USART_InitStruct.USART_StopBits = USART_StopBits_1 ;
USART_InitStruct.USART_WordLength = USART_WordLength_8b ;
USART_Init(USART1,&USART_InitStruct) ;
USART_Cmd(USART1,ENABLE) ; //串口使能
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE) ; //打开接收中断
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn ;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1 ;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1 ;
NVIC_Init(&NVIC_InitStruct) ;
}
void USART1_IRQHandler(void) //中断服务函数
{
u8 res ;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
res = USART_ReceiveData(USART1) ;
USART_SendData(USART1,res) ;
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //系统中断优先级分配为2
My_USART1_Init() ;
while(1) ;
}
打开串口调试助手调试:

成功运行
史海拾趣
|
出来作研发也一年了,很有些体会。在这里想与大家分享下! 1. 不要把自己搞成“实验机器”,要多在课题开展前进行详细的课题论证,信息搜集和筛选。 企业一般做课题都很着急,课题进度要求很快,作为研发人员,要做大量的实验,筛选路线,打通 ...… 查看全部问答> |
|
人们可能会对电子产品的开发与设计方法坚持某种不变的观念,甚至对解决不同问题所采用的器件这样的小事都有某种思维定势,这是可以理解的。 我认识到,对于电子设计人员来说,“熟悉招致轻视”这样的说法并不适用于他们。甚至那些我所认识的最有创 ...… 查看全部问答> |
|
程序如下;怎么ADC0809一直处于忙状态 (P[0..7]接D[0..7]P0接数码管) #include #define uchar unsigned char #define uint unsigned int uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示码0-9 ...… 查看全部问答> |
|
如何把 51 单片机中的 .c 文件和 .h 文件 和 VC写的工程文件做成库 问题一: 在 51单片机 中用 C 写的 .c 和.h 文件,如何做成库呢?51的编译器是 IAR 问题二: 如何把VC写的一个 C 工程文件做成库呢? 问题三: 老大只说让我把上面这两种 C 语言写的函数和文件做成库,应该是做成 lib 库呢,还是做成 dll 库呢 ...… 查看全部问答> |
|
高科技大型上市公司招聘: 嵌入式系统设计工程师 /通信产品设计工程师 / 系统软件设计工程师 工作地点 深圳 本公司是深圳一家高科技大型上市公司,主要经营电力系统产品生产研发,微电子产品生产研发,光磁设备,公司内有员工高层公寓,食堂,文体活动中心,员工家属楼多处,座落于美丽的深圳市福田区笔架山与莲花山之间,公司目前有员工6000多人,工程师及 ...… 查看全部问答> |
|
正在开发wince下的驱动,能否通过应用程序来动态调整TFT的分辨率?比如说从640x480调整到320x240,调整过程中WINCE不能重新启动? 我发现可以通过应用程序来进行屏幕旋转,有没有调整分辨率的函数? 谢谢… 查看全部问答> |
|
ModelSim6.5 KeyGen http://d.namipan.com/d/28d735fadc6867c49c730d5bed1ed47d448f7684102f0d00… 查看全部问答> |
|
助力绿色照明!《CFL/LED照明驱动IC应用设计全攻略》电子书正式发布!欢迎下载并传播! 星期一, 10/25/2010 - 08:18 — 创新网小编 传统照明企业在转向节能灯或者LED灯具生产后会面临一个严峻的挑战:就是从原来的强电领域转到弱电领域,要应对 ...… 查看全部问答> |




