STM32学习笔记——之USART1篇
三个USART:USART1位于高速APB2总线上,USART2、3位于APB1总线上
学习环境:
STM32芯片:STM32F103VBT6
开发板:万利STM3210B-LK1
USART1引脚    PA9——USART1 TX,  PA10——USART1 RX
1、USART1与PC串口通信(STM32串口发送)
首先需要进行USART1的配置,方可实现串口通信功能
USART1配置(使用STM32固件库V2.0):
stm32怎么使用printf
①开启USART1时钟以及GPIOA端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
②配置USART1的RX(PA10)引脚以及TX(PA9)引脚
首先定义结构体变量,用来配置相应引脚的速度以及输入输出模式
GPIO_InitTypeDef  GPIO_InitStructure;
/***********************************
结构体声明如下
typedef struct
{
    u16 GPIO_Pin;
    GPIOSpeed_TypeDef GPIO_Speed;
    GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
************************************/
配置USART1的RX(PA10)引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
配置USART1的TX(PA9)引脚
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的波特率、数据位数、停止位、校验以及硬件流控制
首先定义结构体变量
    USART_InitTypeDef  USART_InitStructure;
/********************************************
/* USART Init Structure definition */
typedef struct
{
  u32 USART_BaudRate;
  u16 USART_WordLength;
  u16 USART_StopBits;
  u16 USART_Parity;
  u16 USART_Mode;
  u16 USART_HardwareFlowControl; 
} USART_InitTypeDef;
********************************************/
    USART_InitStructure.USART_BaudRate = 9600;  //波特率--9600
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位数--8位
    USART_InitStructure.USART_StopBits = USART_StopBits_1;  //停止位—1位
    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);
④使能USART1
USART_Cmd(USART1, ENABLE);
自此上面四步即可实现USART1串口配置
(1)利用STM32固件库实现USART1串口发送功能
实现USART1配置后,即可实现串口通信功能,在此下面程序实现了USART1串口发送功能
CPU_INT08U TxBuffer[] = "\n\rBuffer Send from USART1 to PC using Flags\n\r";
TxBuffer[]为USART1准备发送到PC的字符串,此发送程序通过UCOS-II建立任务实现,发送函数使用STM32固件库V2.0中的发送函数实现,任务程序如下
static void Task3Usart1(void *pdata)
{
CPU_INT08U TxCounter = 0;
pdata = pdata;
    while(1)
    {
        while(TxCounter < strlen(TxBuffer))
        {
            USART_SendData(USART1, TxBuffer[TxCounter++]);  //串口发送函数
            while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
            {}  //等待串口发送寄存器为空
        }
        TxCounter = 0;
        OSTimeDly(OS_TICKS_PER_SEC);  延时,实现任务切换
    }
}   
本节实现了使用STM32固件库实现USART1的配置以及通过固件库的发送函数实现串口发送功能;
(2)利用printf函数实现USART1向PC发送数据
首先将Project->Options->General Options->Library Configuration->Library下拉列表框中选为FULL
其次进行宏定义,并包含头文件#include "stdio.h"
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
再次将printf函数进行修改,将其指向USART1
PUTCHAR_PROTOTYPE
{
  /* Write a character to the USART */
  USART_SendData(USART1, (u8) ch);
  /* Loop until the end of transmission */
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
  {
  }
  return ch;
}
实现USART1向PC发送数据程序如下,使用UCOS-II建立的任务中的程序
static void Task3Usart1(void *pdata)
{
pdata =pdata;
while(1)
    {
        printf("\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r");
        OSTimeDly(OS_TICKS_PER_SEC);
    }
}
本节使用Printf函数实现了USART1向PC发送数据的串口通信功能;
2、USART1与PC串口通信(STM32串口接收,使用中断实现)
USART具有10个中断源,只有一个接口连接到中断控制器(USART的各种中断事件被连接到同一个中断向量),因此在进入中断时需要软件判断发生的是哪个中断。
USART1串口配置前三步如上节所述①②③,接下来配置串口使能中断
④USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //使能接收数据寄存器不为空产生中断
⑤USART_Cmd(USART1, ENABLE);  //使能串口USART1
⑥配置NVIC
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  /* Configure the NVIC Preemption Priority Bits */ 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  //无抢占式优先级
 
  /* Enable the USART1 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //子优先级设置为零
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
至此以上几步实现了USART1的串口中断接收配置,接下来在中断函数中写代码实现中断接收,以及将接收成功的字符发送到PC,在PC端利用串口助手进行监视接收是否成功。
程序利用UCOS-II内核实现,使用的UCOS-II版本V2.86,将USART1串口中断函数写在app_vect_v5.c文件中,根据此C文件中开始部分的定义