您的位置:首页 > 编程语言

STM32 学习八 USART通信3 库函数方式编程

2015-01-17 10:26 363 查看
STM32 库是ST公司针对STM32提供的函数接口,即API,开发简便、维护维护、阅读。

CMSIS标准(摘自百度百科):

为了解决不同的芯片厂商生产的Cortex微控制器软件兼容性问题,ARM与芯片厂商建立了CMSIS标准(Cortex MicroController Software Interface Standard)。



以STM32F10XX序列处理为例,介绍CMSIS的使用步骤。

1、从ST官方网站下载3.0以上版本的标准外设库。

2、基于开发软件新建工程,建立相应的文件目录,注意询问是否加入启动文件时,选择“否”。

3、根据所选芯片,把Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm中的启动代码加到工程中。

4、根据处理器FLASH容量的大小,选择启动代码。stm32f10x.h 的66-73 行表明了启动代码的类型。例如STM32F10X_HD 行表示大容量的,如果不需要直接注释掉即可。

5、选择是否启用标准外设库。stm32f10x.h的105行的USE_STDPERIPH_DRIVER用于确定是否启用,如果不启用直接注释掉。

6、确定处理器的频率。system_stm32f10x.c的110-115行用于确定处理器的频率,注释掉不需要的即可。例如处理器的频率为是36MHz,注释SYSCLK_FREQ_72MHz,去掉SYSCLK_FREQ_36MHz注释。

STM32 库函数组织



USART库函数





代码示例:

#include "stm32f10x_lib.h"
#include <stdio.h>
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(u32);

#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)

int main(void)
{
u8 data;
u8 i;
//初始化
RCC_Configuration();
GPIO_Configuration();
USART_Configuration(9600);

//UE使能位
data='A';
USART_Cmd(USART1,ENABLE);
for(i=0;i<30;i++){
USART_SendData(USART1,data);
data++;
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
}

/*******************************************************************************
* 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); //打开USART1时钟

//GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);

}

/*******************************************************************************
* Function Name : GPIO_Configuration
* Description : 初始化GPIO外设 USART1与PA9复用.这里对9 10脚进行设置
* 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 rate){
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate=rate;
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; //使能
USART_Init(USART1,&USART_InitStructure); //初始化结构体
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: