×
单片机 > 单片机程序设计 > 详情

STM32 串口通信(库函数操作)

发布时间:2020-06-03 发布时间:
|

1.说在前面:


清明三天小假期,放松一下无可厚非,但是,依旧要完成自己的学习任务


2.串口通信的简单介绍:


1.将串口作为一个沟通的渠道,可以和外界进行接收和发送信号


2.STM32和串口相关的寄存器:


2-1:USART_SR(状态寄存器):存储着MCU的一些状态


2-2:USART_DR(数据寄存器):暂存着一些数据信息


2-3:USART_BRR(波特率寄存器:暂存波特率信息


2-4:USART_CRI(控制寄存器):用于给usart进行使能



3.注:波特率的计算方法:

只要给出相应的时钟频率和设置usartdiv,就可以计算出波特率


3.串口通讯的简单配置和使用


1.其实基于库函数而言:需要有一个理顺的思路,知道每一步需要做什么,然后去寻找相应的库函数


2.怎样实现串口通讯呢?


1.串口时钟和GPIO时钟使能


2.串口复位(不必须)


3.GPIO设置:注意rxd和txd在设置过程中设置输入输出方法的不同(AF_PP|IN_FLOATING)


4.串口参数初始化(这里面要初始化蛮多参数的,但是要记住每个参数的设定,通信双方要约定参数一致)


5.开启中断,使能 NVIC


6.实现串口的使能


7.编写中断处理函数


8.实现串口数据的收发


9.实现串口传输状态获取


#include"stm32f10x.h"

 

void my_USART_Init()

{

GPIO_InitTypeDef GPIO_InitStruct;

USART_InitTypeDef USART_InitStruct;

NVIC_InitTypeDef  NVIC_InitStruct;

//1.时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//ENABLE THE GPIOA

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//ENABLE THE USART1

//2.GPIOA9 init

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复位推挽输出

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9 ;

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;

GPIO_Init(GPIOA,&GPIO_InitStruct);

//2.GPIOA10 init

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;

GPIO_Init(GPIOA,&GPIO_InitStruct);

//3.usart init

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;//1位停止位

USART_InitStruct.USART_WordLength=USART_WordLength_8b;//8位数据位

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()

{

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级

my_USART_Init();

while(1);

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
LCD驱动-JZ2440