STM32-驱动程序

以STM32F429为例

1 USART

配置USART2

usart.h文件

根据硬件设置别名:

#ifndef __USART_H
#define __USART_H

#include "stm32f4xx.h"
#include <stdio.h>

//配置USART2
#define USART2_CLK                 RCC_APB1Periph_USART2
#define USART2_BAUDRATE            115200

#define USART2_RX_GPIO_PORT                GPIOD
#define USART2_RX_GPIO_CLK                 RCC_AHB1Periph_GPIOD
#define USART2_RX_PIN                      GPIO_Pin_6
#define USART2_RX_AF                       GPIO_AF_USART2
#define USART2_RX_SOURCE                   GPIO_PinSource6

#define USART2_TX_GPIO_PORT                GPIOD
#define USART2_TX_GPIO_CLK                 RCC_AHB1Periph_GPIOD
#define USART2_TX_PIN                      GPIO_Pin_5
#define USART2_TX_AF                       GPIO_AF_USART2
#define USART2_TX_SOURCE                   GPIO_PinSource5

//USART中断
#define USART2_IRQHandler  					       USART2_IRQHandler 
#define USART2_IRQ                         USART2_IRQn

void USART2_Config(void);
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch );
void Usart_SendStr_length( USART_TypeDef * pUSARTx, uint8_t *str,uint32_t strlen );
void Usart_SendString( USART_TypeDef * pUSARTx, uint8_t *str);

#endif

usart.c:

这里开启串口中断,也可以不开启

#include "./usart/USART.h"   
//中断 为 第四组 配置为10
//配置中断NVIC
static void NVIC_Configuration(void)
{
	NVIC_InitTypeDef NVIC_Structure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//四位全做优先级
	
	NVIC_Structure.NVIC_IRQChannel=USART1_IRQ;
	NVIC_Structure.NVIC_IRQChannelPreemptionPriority=10;//抢占优先级设置为10
	NVIC_Structure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Structure.NVIC_IRQChannelSubPriority=0;
	NVIC_Init(&NVIC_Structure);
}
//配置串口
void USART2_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	RCC_AHB1PeriphClockCmd(USART2_RX_GPIO_CLK|USART2_TX_GPIO_CLK,ENABLE);//使能端口时钟 
	RCC_APB1PeriphClockCmd(USART2_CLK,ENABLE);//使能USART时钟
	
	//GPIO初始化
	//RX TX相同部分
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出、
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
	//RX GPIO初始化
	GPIO_InitStructure.GPIO_Pin=USART2_RX_PIN;
	GPIO_Init(USART2_RX_GPIO_PORT,&GPIO_InitStructure);

	//TX GPIO初始化
	GPIO_InitStructure.GPIO_Pin=USART2_TX_PIN;
	GPIO_Init(USART2_TX_GPIO_PORT,&GPIO_InitStructure);	
	
	//连接PX.x到USARTx_TX
	GPIO_PinAFConfig(USART2_RX_GPIO_PORT,USART2_RX_SOURCE,USART2_RX_AF);
	GPIO_PinAFConfig(USART2_TX_GPIO_PORT,USART2_TX_SOURCE,USART2_TX_AF);
	
	USART_InitStructure.USART_BaudRate=USART2_BAUDRATE;
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None ;
	USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
	USART_InitStructure.USART_Parity=USART_Parity_No;//不使用校验
	USART_InitStructure.USART_StopBits=USART_StopBits_1;
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	//初始化USART
	USART_Init(USART2,&USART_InitStructure);
	
	NVIC_Configuration();//不使用中断就不用	
	//串口中断使能
	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//不使用中断就不用	

	//串口使能
	USART_Cmd(USART2,ENABLE);
	
}

/*****************  发送一个字符 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch )
{
	/* 发送一个字节数据到USART1 */
	USART_SendData(pUSARTx,ch);
		
	/* 等待发送完毕 */
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}

/*****************  指定长度的发送字符串 **********************/
void Usart_SendStr_length( USART_TypeDef * pUSARTx, uint8_t *str,uint32_t strlen )
{
	unsigned int k=0;
    do 
    {
        Usart_SendByte( pUSARTx, *(str + k) );
        k++;
    } while(k < strlen);
}

/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, uint8_t *str)
{
	unsigned int k=0;
    do 
    {
        Usart_SendByte( pUSARTx, *(str + k) );
        k++;
    } while(*(str + k)!='\0');
}
/****USART2 重定向到fprint函数****/
int fputc(int ch,FILE *f)
{
	USART_SendData(USART2,ch);
	while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//等待发送完成
	
	return ch;
	
}

因为开启了串口中断,因此需要在中断文件 stm32f4xx_it.c中添加一下内容
#include "stm32f4xx.h" //因为需要用到stm32f4xx_usart.c中的内容,因此需要增加
//USART2中断函数
void USART2_IRQHandler (void)
{
	uint8_t ucTemp;
	//if(USART_GetFlagStatus(USART2,))
	if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
	{
		ucTemp=USART_ReceiveData(USART2);
		USART_SendData(USART2,ucTemp);
	}
}





版权声明:本文为weixin_37058227原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。