STM32F103VET6-keil工程配置-串口收发不定长数据

时间:2024-01-28 18:20:29

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 }