STM32学习第三天----有个USART的发送数据的问题没有解决

来源:互联网 发布:保安巡更软件 编辑:程序博客网 时间:2024/06/03 00:38

星期四是最不喜欢的一天,因为要有三节课要上,还有一个尴尬的问题:早上在8楼碰到了一个让我心潮澎湃的童鞋,然而.....额太尴尬不写了!!!所以好难过的样子。。

第三天 看了两集视频, 掌握了USART 模块的设置: 需要设置UE位使能、M位来定义字长、停止位的位数、TE位、BRR寄存器选择所要求的波特率,但是在搞什么USART->BRR的波特率的时候遇到了一个让我百思不得其解的问题,所以到了这个时候才来写的总结。(到现在还是不理解)。代码跟视频上的是一模一样的说,但是为什么执行的效果观察确是不一样的呢。我的代码只要一设置USART->BRR的值,那就只能发送一次的数据,只要不设置USART->BRR,那就能无限次发送,但是寄存器内容很捉鸡,如下:

《》

代码真的是一模一样的:

#include "stm32f10x.h"#include <stdio.h>#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)1#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 Delay_MS(u16 dly){u16 i, j;for (i = 0; i < dly; i++)for (j = 1000; j > 0; j--);}void GPIO_Configuration(void);void RCC_Configuration(void);int main(void){float Div;u16 M, F, BRR;u32 Bound;u8 data = 'A';RCC_Configuration();GPIO_Configuration();//USART 模块的设置: UE位使能、M位来定义字长、停止位的位数、TE位、BRR寄存器选择所要求的波特率USART1->CR1 |= (1 << 13);USART1->CR1 &= ~(1 << 12);USART1->CR2 &= ~(3 << 12);USART1->CR1 |= (1<<3);//......./*9600 = 72*1000*1000/(16 * U) *U = 72000000/(9600*16) = 468.75 *波特率整数部分可以直接写, 小数部分有公式 *M = 468 *F = (0.75) * 16 = 12 = 0x0C */USART1->BRR = 7500;//*****问题的所在地//发送26字母 到USART1的TXDfor (F = 0; F < 26; F++){while (USART1 -> SR & (1 << 7) == 0);//判断寄存器空吗?USART1->DR = data;data++;}}void GPIO_Configuration(){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 RCC_Configuration(){//---------使用外部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 = 72MHZRCC_PLLCmd(ENABLE);//Enable PLLCLKwhile (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//Wait till PLLCLK is readyRCC_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);//..............AFIO.......RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//..............USART1.....//GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE)}


0 0
原创粉丝点击