1、新建一个标准空白工程
2、设置时钟源为外部HSE时钟
1 #ifndef __SYSCLK_CONFIG_H 2 #define __SYSCLK_CONFIG_H 3 #include "main.h" 4 5 #define SystemCoreClock 72000000 6 void SYSCLK_Config(void); 7 void Delay_us(uint32_t nus); 8 void Delay_ms(uint32_t nms); 9 void Delay_s(uint32_t ns); 10 #endif
#include "SysCLK_Config.h" /********************************************** 1、配置HSE外部时钟 2、开启HSE/HSI时钟,并等待HSE/HSI稳定 3、设置AHB,APB2,APB1 的分频因子 4、设置PLL时钟来源,和PLL倍频因子,设置各种频率主要就是在这里设置 5、开启PLL等待PLL稳定 6、把PLLCK切换为系统时钟SYSCLK 7、读取时钟切换状态,确保PLLCLK被选择为系统时钟 **********************************************/ void SYSCLK_Config(void) { __IO uint32_t HSEStartUpStatus = 0; /* 复位RCC时钟为初始化状态 */ RCC_DeInit(); /* 使能RCC时钟源为HSE时钟 */ RCC_HSEConfig(RCC_HSE_ON); /* 等待HSE时钟启动稳定 */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* 只有HSE稳定之后才会往下执行 */ if(HSEStartUpStatus == SUCCESS) { /* 使能FALSH 预存储缓冲区 */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH_Latency_2); /* 设置AHB总线时钟分频因子 */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 设置APB1总线时钟分频因子 */ RCC_PCLK1Config(RCC_HCLK_Div2);//APB1总线最高时钟为36MHz /* 设置APB2总线时钟分频因子 */ RCC_PCLK2Config(RCC_HCLK_Div1); /* 设置PLL倍频因子 */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); /* 设置PLL倍频因子 */ RCC_PLLCmd(ENABLE); /* 等待PLL稳定 */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* PLL稳定后,把PLL时钟切换为系统时钟 SYSCLK */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 读取时钟切换状态位,确保PLLCLK被选中为系统时钟 */ while(RCC_GetSYSCLKSource() != 0x08); } else { while(1); } } void Delay_us(uint32_t nus) { uint32_t temp; SysTick_Config(SystemCoreClock/1000000); //开启SYSTick定时器 for(temp = 0;temp<nus;temp++) { while(!((SysTick->CTRL)&(1<<16))); } SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk; //关闭系统定时器 } void Delay_ms(uint32_t nms) { uint32_t temp; SysTick_Config(SystemCoreClock/1000); //开启SYSTick定时器 for(temp = 0;temp<nms;temp++) { while(!((SysTick->CTRL)&(1<<16))); } SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk; //关闭系统定时器 } void Delay_s(uint32_t ns) { uint32_t temp; SysTick_Config(SystemCoreClock); //开启SYSTick定时器 for(temp = 0;temp<ns;temp++) { while(!((SysTick->CTRL)&(1<<16))); } SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk; //关闭系统定时器 }
4、串口通过中断接收数据并回传
1 #ifndef __BSP_USART_H 2 #define __BSP_USART_H 3 #include "main.h" 4 5 /* 时钟线宏定义 */ 6 #define Debug_Usart_APBxCLKCmd RCC_APB2PeriphClockCmd 7 #define Debug_Usart_GPIO_APBxCLKCmd RCC_APB2PeriphClockCmd 8 9 /* GPIO端口宏定义 */ 10 #define Debug_Usart_Rx_GPIO_PORT GPIOA 11 #define Debug_Usart_Rx_GPIO_PIN GPIO_Pin_10 12 #define Debug_Usart_Rx_GPIO_CLK RCC_APB2Periph_GPIOA 13 14 #define Debug_Usart_Tx_GPIO_PORT GPIOA 15 #define Debug_Usart_Tx_GPIO_PIN GPIO_Pin_9 16 #define Debug_Usart_Tx_GPIO_CLK RCC_APB2Periph_GPIOA 17 18 /* USART外设宏定义 */ 19 #define Debug_Usart USART1 20 #define Debug_Usart_Baudrate 115200 21 #define Debug_Usart_Clk RCC_APB2Periph_USART1 22 23 /* 串口中断宏定义*/ 24 #define Debug_Usart_IRQ USART1_IRQn 25 #define Debug_Usart_IRQHandle USART1_IRQHandler 26 27 28 /* 函数声明 */ 29 void Bsp_Usart_Init(void); 30 31 #endif
1 #include "bsp_usart.h" 2 3 void Bsp_Usart_Init(void) 4 { 5 /* 结构体定义 */ 6 GPIO_InitTypeDef GPIO_Initstructure; 7 NVIC_InitTypeDef NVIC_Initstructure; 8 USART_InitTypeDef USART_Initstructure; 9 10 /* 使能时钟 */ 11 Debug_Usart_GPIO_APBxCLKCmd(Debug_Usart_Rx_GPIO_CLK|Debug_Usart_Tx_GPIO_CLK,ENABLE); 12 Debug_Usart_APBxCLKCmd(RCC_APB2Periph_USART1,ENABLE); 13 14 /* 配置 GPIO 结构体 */ 15 GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz; 16 GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 17 GPIO_Initstructure.GPIO_Pin = Debug_Usart_Tx_GPIO_PIN; 18 GPIO_Init(Debug_Usart_Tx_GPIO_PORT,&GPIO_Initstructure); 19 20 GPIO_Initstructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 21 GPIO_Initstructure.GPIO_Pin = Debug_Usart_Rx_GPIO_PIN; 22 GPIO_Init(Debug_Usart_Rx_GPIO_PORT,&GPIO_Initstructure); 23 24 /* 配置 USART 结构体 */ 25 USART_Initstructure.USART_BaudRate = Debug_Usart_Baudrate; //波特率 26 USART_Initstructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制 27 USART_Initstructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; //收发模式 28 USART_Initstructure.USART_Parity = USART_Parity_No; //校验位 29 USART_Initstructure.USART_StopBits = USART_StopBits_1; //停止位 30 USART_Initstructure.USART_WordLength = USART_WordLength_8b; //数据长度 31 USART_Init(Debug_Usart,&USART_Initstructure); 32 33 /* 配置 NVIC 结构体 */ 34 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断向量组 35 36 NVIC_Initstructure.NVIC_IRQChannel = Debug_Usart_IRQ; 37 NVIC_Initstructure.NVIC_IRQChannelCmd = ENABLE; 38 NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 39 NVIC_Initstructure.NVIC_IRQChannelSubPriority = 1; //子优先级 40 NVIC_Init(&NVIC_Initstructure); 41 42 /* 使能串口接收中断 */ 43 USART_ITConfig(Debug_Usart,USART_IT_RXNE,ENABLE); 44 45 /* 使能串口 */ 46 USART_Cmd(Debug_Usart,ENABLE); 47 } 48 void Debug_Usart_IRQHandle(void) /* 串口中断服务函数 */ 49 { 50 uint8_t ch; 51 52 /* 检测接收缓冲区满 开始接收数据 */ 53 if(USART_GetFlagStatus(Debug_Usart,USART_FLAG_RXNE) != RESET) 54 { 55 ch = USART_ReceiveData(Debug_Usart); 56 USART_SendData(Debug_Usart,ch); 57 /* 等待发送缓冲区为空 */ 58 while(USART_GetFlagStatus(Debug_Usart,USART_FLAG_TXE) == RESET); 59 } 60 }