1、调用库函数编程和直接配置寄存器编程的区别:
2、CMSIS标准:
3、STM32库函数的组织:
4、程序例举:
调用库函数实现通过USART发送数据(26个大写的英文字母)
首先:在主函数部分先要(调用自己编写的函数)对USART要用到的I/O端口进行配置、打开系统时钟配置和对USART1进行参数配置
下图是通过调用库函数对USART1的参数进行配置,将其配置成异步收发模式、波特率用户可以自定的串口:
/**************************************************************************************************
* 硬件平台:STM32F103VC
* 学习重点:调用库函数来实现对USART的操作
* 实现功能:软件仿真,实现STM32通过USART1发送数据
* 作 者:赵小龙
**************************************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h" //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。
#include "stm32f10x_map.h"
/*----------------函数声明部分---------------*/
void delay1ms(int t) ;
void RCC_Configuration(void) ;
void GPIO_Configuration(void) ;
void USART_Configuration(u32 BaudRate) ;
/* Private functions -----------------------------------------------------------------------------*/
/**************************************************************************************************
* Function Name : main
* Description : 软件仿真,从USART1发送26个大写的英文字母
* Input : None
* Output : None
* Return : None
****************************************************************************************************/
int main(void)
{
u8 i,data;
/*--------配置开启系统时钟、配置USART1发送/接收使用的两个I/O口、配置USART1---------------------------------------------*/
RCC_Configuration();
GPIO_Configuration();
USART_Configuration(19600);
/*--------发送一串字符‘A’--‘Z’到USART1的DR-----------------------------------------------------------------------------*/
data='A';
for(i=0;i<26;i++)
{
USART_SendData(USART1, data) ;
data++ ;
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) ;//发送完成标志位为1时便是数据发送完毕,若为0时则应让程序等待(等待数据发送发送完成)
/*注意:这里最好不要按照以下形式书写,否则会出错,具体原因我暂且还不知道
u8 status ;
status = USART_GetFlagStatus(USART1, USART_FLAG_TC) ; //将查看状态寄存器的函数的返回值赋值给变量status
while(status == RESET) ;
*/
}
}
/*******************************************************************************
* Function Name : Delay_Ms
* Description : delay 1 ms.
* Input : dly (ms)
* Output : None
* Return : None
*******************************************************************************/
void delay1ms(int t)
{
//机器周期T = 1/(72000000/12)s = 1/6000000 s = 1/6 us
int temp = 6000/4 ;
while(t--)
{
while(temp--)
{ ; }
}
}
/*******************************************************************************
* 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);
}
/*******************************************************************************
* Function Name : USART_Configuration
* Description : 初始化串口USART1(异步收发模式)
* Input : BaudRate (要设置的波特率)
* Output : None
* Return : None
*******************************************************************************/
void USART_Configuration(u32 BaudRate)
{
//1、定义一个用于初始化USART的结构体
USART_InitTypeDef USART_InitStructure;
//2、给结构体元素赋值,设置 波特率、数据帧的位数、停止位的位数、奇偶校验位、硬件流控制位、USART模式(发送、接收)
USART_InitStructure.USART_BaudRate = BaudRate;
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_Tx | USART_Mode_Rx;
//3、调用函数USART_Init();用上面的结构体值作为参数对USART1进行初始化
USART_Init(USART1, &USART_InitStructure);
//4、调用函数USART_Cmd();对USART1进行使能
USART_Cmd(USART1, ENABLE);
}
程序运行前:
程序运行后:
上一篇:STM32串行通信USART讲解笔记
下一篇:STM32 串行通信 USART 程序例举
推荐阅读最新更新时间:2024-03-16 15:37