STM32 USART寄存器方式编程

来源:互联网 发布:树莓派安装rpm软件 编辑:程序博客网 时间:2024/06/08 14:56
#include "stm32f10x.h"#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)))// AliasAddr = 0x2200 0000 + ((A-0X2000 0000)*8+n)*4      (n= 0~7)//           = 0x2200 0000+ (A-0X2000 0000)*32+n*4      4个字节,32个位;#define PAout(n) BitBand(GPIOA_ODR_A,n)  //PAout输出表达式;#define PAin(n)  BitBand(GPIOA_IDR_A,n)  //PAin输出表达式;#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)void RCC_Configuration(void);//首先设置系统时钟为8MHZvoid GPIO_Configuration(void);void delay1ms(u16 t){    u16 i,j;   for(i=0;i<t;i++)     for(j=1000;j>0;j++); }int main(void){float DIV;u16 M,F,BRR;  u32 Bound;u8 data='A';RCC_Configuration();GPIO_Configuration();//USART1模块的设置;//1.  USART_CR1置位UE使能、 2.  USART_CR1的M位定义字长、    3.  USART_CR2中STOP停止位的位数、//4.  USART_CR1中的TE位、   5.  USART_BRR寄存器选择波特率、 6.  把要发送的数据写入USART_DR寄存器中USART1->CR1|=(1<<13);USART1->CR1&=~(1<<12);//M=0; 一个起始位,8个数据位,n个停止位。USART1->CR2|=~(3<<12);//1个停止位USART1->CR1 |=(1<<3);//TE位使能;//;Bound=9600;//设定波特率值是9600DIV=(float)(72*1000*1000/(Bound*16));//USARTDIV整数M=DIV;//USARTDIV整数  F=(DIV-M)*16;//USARTDIV小数位BRR=(M<<4)| F;//把波特率计算值给BRR寄存器USART1->BRR=BRR;//把波特率计算值给BRR寄存器//发送一个字符'A'到USART1的TXD  ,把要发送的数据写入USART_DR寄存器中for(F=0;F<20;F++){USART1->DR=data;  data++;while((USART1->SR&1<<6)==0);//USART_SR的TC置一,表示发送数据完成;否则没有完成;}return 0;}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 stateRCC_HCLKConfig(RCC_SYSCLK_Div1);//HCLK = SYSCLKRCC_PCLK2Config(RCC_HCLK_Div1);//PCLK2 =  HCLKRCC_PCLK1Config(RCC_HCLK_Div2);//PCLK1 = HCLK/2RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//PLLCLK = 8MHZ * 9 =72MHZ,系统给外设的时钟fpclkxRCC_PLLCmd(ENABLE);//Enable PLLCLKwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//Wait till PLLCLK is ready    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//Select PLL as system clockwhile(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);  }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);}


0 0
原创粉丝点击