STM32-串口程序

    学习各种硬件,串口是必不可少的也是首要学习的外设,因为有了串口之后,就可以和硬件进行简单的交互,也能更加方便的验证所写的程序的正确性。
   STM32拥有多个USART,支持多种模式的配置,具体的可以参照STM32的相关手册进行学习

这里写图片描述
再来看一下USART的功能框图:
这里写图片描述
在使用任何一个外设功能之前,都要看看它所对应的功能框图,这样有助于理解功能的使用。
接下来看一下关于USART的相关寄存器和可操作的库函数。
这里写图片描述

这里写图片描述
最后还需要看一张关于GPIO的USART的引脚复用:
这里写图片描述
因为USART与外界沟通是用控制器的GPIO引脚的复用功能,所以在使用USART功能之前需要把GPIO配置成相应的输入输出模式。
同时如果需要开启中断,还要进行中断通道的使能,和优先级的分组设置。

#include "stm32f10x.h"
/**
  * @brief  初始化GPIO,默认速度为GPIO_Speed_50MHz;
  *         
  * @param  GPIO分组
  * @param  GPIO引脚
    * @param  GPIO引脚模式
  * @retval None
  */
void GPIO_init(GPIO_TypeDef * GPIOx,u16 GPIO_Pin,GPIOMode_TypeDef Mode)
{
    GPIO_InitTypeDef GPIO_InitStruct;                                       
    GPIO_InitStruct.GPIO_Mode=Mode;                         
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOx,&GPIO_InitStruct);
}
/**
  * @brief  初始化USART
  *         
  * @param  波特率,数据位数,停止位,发送接收模式

  * @retval None
  */
void UART_init(int BaudRate,u16 WordLength,u16 StopBits,u16 Parity,u16 Mode)
{
    USART_InitTypeDef USART_InitStruct;
    USART_InitStruct.USART_BaudRate=BaudRate;
    USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode=Mode;   
    USART_InitStruct.USART_Parity=Parity;
    USART_InitStruct.USART_StopBits=StopBits;
    USART_InitStruct.USART_WordLength=WordLength;

    USART_Init(USART1,&USART_InitStruct);
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

    USART_Cmd(USART1,ENABLE);
}
/**
  * @brief  初始化中断向量
  *         
  * @param  中断通道,抢占优先级,相应优先级,使能/失能

  * @retval None
  */
void NVIC_init(u8 NVIC_IRQChannel,u8 NVIC_IRQChannelPreemptionPriority,u8 NVIC_IRQChannelSubPriority,u8 NVIC_IRQChannelCmd)
{

        NVIC_InitTypeDef NVIC_InitStrue;
        NVIC_InitStrue.NVIC_IRQChannel=NVIC_IRQChannel;
        NVIC_InitStrue.NVIC_IRQChannelCmd=NVIC_IRQChannelCmd;
        NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=NVIC_IRQChannelPreemptionPriority;
        NVIC_InitStrue.NVIC_IRQChannelSubPriority=NVIC_IRQChannelSubPriority;
        NVIC_Init(&NVIC_InitStrue);

}
int main()
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

        GPIO_init(GPIOA,GPIO_Pin_9,GPIO_Mode_AF_PP);
        GPIO_init(GPIOA,GPIO_Pin_10,GPIO_Mode_IN_FLOATING);

        NVIC_init(USART1_IRQn,1,1,ENABLE);

        GPIO_init(GPIOA,GPIO_Pin_0,GPIO_Mode_Out_PP);
        GPIO_ResetBits(GPIOA,GPIO_Pin_0);
        UART_init(115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_Mode_Tx|USART_Mode_Rx);
        while(1);



}

void USART1_IRQHandler(void)
{
    u8 res;
    if(USART_GetITStatus(USART1,USART_IT_RXNE))
    {
        res=USART_ReceiveData(USART1);
        USART_SendData(USART1,res);

    }

}

最后的那个函数是串口接收中断的响应函数,主要串口接收到了数据,响应的标志位置1之后就进入到中断函数中,前提是要使能串口接收中断。
   以上程序是是实现了串口的接收和发送,发送接收进来的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值