×
单片机 > 单片机程序设计 > 详情

STM32 USART寄存器方式编程

发布时间:2020-06-03 发布时间:
|


#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);//首先设置系统时钟为8MHZ

void GPIO_Configuration(void);

void delay1ms(u16 t){

    u16 i,j;

  for(i=0;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;//设定波特率值是9600

DIV=(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 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,系统给外设的时钟fpclkx

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

 

}

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

}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC单片机的多路AD切换程序设计