STM32-(09):USART库函数方式编程

上一篇:STM32-(08):USART通信基础下一篇:STM32-(10):Printf

STM32库函数

STM32库是由ST公司针对STM32提供的函数接口,即API(Application Program Interface),开发者可调用这些函数接口来配置STM32 的寄存器,使开发人员得以脱离最底层的寄存器操作,有开发快速,易于阅读,维护成本低等特点。

当我们调用库的API的时候可以不用挖空心思去了解库底层的寄存器操作,就像当年我们学习C语言的时候,用Printf()函数时只是学习它的使用格式,并没有去研究它的源码实现,如非必要,可以说是老死不相往来。

库是假设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。

在这里插入图片描述

CMSIS 标准

在这里插入图片描述

因为基于Cortex的某系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的Cortex微控制器软件的兼容问题,ARM与芯片厂商建立了CMSIS标准(Cortex MicroController Sortware Interface Standard)。

在这里插入图片描述

注:MCU层一般都是ARM开发的,CMSIS都是外设访问层,一般是STM32厂商开发的。

STM32库函数组织

在这里插入图片描述

inc(include):表示头文件
src(source):表示源码
stm32f10x:表示芯片型号
其他等命名规则可查阅 STM32F103xx固件函数库用户手册

下面以同步异步收发器(USART)来大概介绍库函数的应用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下面用库函数的方式编写上一篇文章的中的代码

//----------------头文件声明--------------------
#include"stm32f10x_lib.h"		//包含所有的头文件
#include<stdio.h>
//----------------函数声明--------------------
void Delay_MS(u16 dly);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(u32 BaudRate);

#define PA1 GPIOA->BSRR
#define PA0 GPIOA->BRR

#define GPIOA_ODR_A  (GPIOA_BASE+0x0C)
#define GPIOA_IDR_A  (GPIOA_BASE+0x08)
#define GPIOB_ODR_A  (GPIOB_BASE+0x0C)
#define GPIOB_IDR_A  (GPIOB_BASE+0x08)
#define GPIOC_ODR_A  (GPIOC_BASE+0x0C)
#define GPIOC_IDR_A  (GPIOC_BASE+0x08)
#define GPIOD_ODR_A  (GPIOD_BASE+0x0C)
#define GPIOD_IDR_A  (GPIOD_BASE+0x08)
#define GPIOE_ODR_A  (GPIOE_BASE+0x0C)
#define GPIOE_IDR_A  (GPIOE_BASE+0x08)

#define BitBand(Addr,BitNum)    *((volatile unsigned long *)((Addr&0xF0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2)))

#define PAout(n)   BitBand(GPIOA_ODR_A,n)
#define PAin(n)    BitBand(GPIOA_IDR_A,n)
#define PBout(n)   BitBand(GPIOB_ODR_A,n)
#define PBin(n)    BitBand(GPIOB_IDR_A,n)
#define PCout(n)   BitBand(GPIOC_ODR_A,n)
#define PCin(n)    BitBand(GPIOC_IDR_A,n)
#define PDout(n)   BitBand(GPIOD_ODR_A,n)
#define PDin(n)    BitBand(GPIOD_IDR_A,n)
#define PEout(n)   BitBand(GPIOE_ODR_A,n)
#define PEin(n)    BitBand(GPIOE_IDR_A,n)

/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/ 
int main(void)
{	
	u8 i,data;	

	RCC_Configuration();
	GPIO_Configuration();
	USART_Configuration(19600);

	data='A';
	for(i=0;i<30;i++)
	{
		USART_SendData(USART1, data);	 //通过外设USARTx发送单个数据(参数1:哪个串口,参数2:数据)
		data++;
		//检查指定的USART 标志位设置与否(这里参数2选择“发送完成标志位”)
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET) ;  
		//SET表示1,RESET表示0,当等于0,会一直停在这里
		
	}
}
/*******************************************************************************
* Function Name  : Delay_Ms
* Description    : delay 1 ms.
* Input          : dly (ms)
* Output         : None
* Return         : None
*******************************************************************************/
void Delay_MS(u16 dly)
{
	u16 i,j;
	for(i=0;i<dly;i++)
		for(j=1000;j>0;j--);
}

/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
	//----------使用外部RC晶振-----------
	RCC_DeInit();			//初始化为缺省值
	RCC_HSEConfig(RCC_HSE_ON);	//使能外部的高速时钟 
	while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);	//等待外部高速时钟使能就绪
	
	//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);	//Enable Prefetch Buffer
	//FLASH_SetLatency(FLASH_Latency_2);		//Flash 2 wait state
	
	RCC_HCLKConfig(RCC_SYSCLK_Div1);		//HCLK = SYSCLK
	RCC_PCLK2Config(RCC_HCLK_Div1);			//PCLK2 =  HCLK
	RCC_PCLK1Config(RCC_HCLK_Div2);			//PCLK1 = HCLK/2
	RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);	//PLLCLK = 8MHZ * 9 =72MHZ
	RCC_PLLCmd(ENABLE);			//Enable PLLCLK

	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);	//Wait till PLLCLK is ready
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);	//Select PLL as system clock
	while(RCC_GetSYSCLKSource()!=0x08);		//Wait till PLL is used as system clock source
	
	//---------打开相应外设时钟--------------------
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//使能APB2外设的GPIOA的时钟	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	//使能APB2外设的GPIOC的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	//GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);	 
		 
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : 初始化GPIO外设
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/ 
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure USARTx_Tx as alternate function push-pull */
  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);

  /* Configure USARTx_Rx as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

}

void USART_Configuration(u32 BaudRate)
{
	USART_InitTypeDef USART_InitStructure;		//声明一个结构体 
	USART_InitStructure.USART_BaudRate = BaudRate; 		//波特率
	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_Tx | USART_Mode_Rx;  		//TX/RX、发送接收使能
	USART_Init(USART1, &USART_InitStructure);
	USART_Cmd(USART1, ENABLE);
}
//stm32f10x_usart.h
/* Exported types ------------------------------------------------------------*/
/* USART Init Structure definition */
typedef struct
{
  u32 USART_BaudRate; // 设置了USART传输的波特率 ;
  u16 USART_WordLength; // 提示了在一个帧中传输或者接收到的数据位数 ;
  u16 USART_StopBits; // 定义了发送的停止位数目 ;
  u16 USART_Parity;	  // 定义了奇偶模式	;
  u16 USART_Mode;	  // 指定了使能或者失能发送和接收模式 ;
  u16 USART_HardwareFlowControl;  // 指定了硬件流控制模式使能还是失能 ;
} USART_InitTypeDef;

上一篇:STM32-(08):USART通信基础下一篇:STM32-(10):Printf
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要在代码中引入STM32F030x8的头文件和相应的库函数。 以下是一个简单的示例代码,展示如何使用STM32F030串口编程库函数进行开发: ```c #include "stm32f0xx.h" #include <stdio.h> void USART1_Init(void); void USART1_SendChar(char ch); void USART1_SendString(char *str); int main(void) { USART1_Init(); USART1_SendString("Hello, world!\r\n"); while (1) { // do something } } void USART1_Init(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_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); USART_Cmd(USART1, ENABLE); } void USART1_SendChar(char ch) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, ch); } void USART1_SendString(char *str) { while (*str) { USART1_SendChar(*str++); } } ``` 上述代码中,我们使用了STM32F030的USART1模块进行串口通信。首先,我们需要初始化USART1模块,包括GPIO和USART的配置。然后,我们可以使用`USART1_SendChar`函数发送单个字符,也可以使用`USART1_SendString`函数发送字符串。 在使用过程中,需要注意以下几点: 1. 串口配置需要与外部设备的配置相匹配,包括波特率、数据位、停止位、奇偶校验等参数。 2. 在发送数据时,需要检查USART的TXE标志位,以确保发送缓冲区为空。 3. 如果需要接收数据,需要检查USART的RXNE标志位,以确保接收缓冲区中有数据可读。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值