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 }

STM32F103VET6-keil工程配置-USART串口中断的更多相关文章

  1. 第20章 USART—串口通讯—零死角玩转STM32-F429系列

    第20章      USART—串口通讯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  2. 使用 VSCode 给STM32配置一个串口 printf 工程

    使用 VSCode 给STM32配置一个串口 printf 工程 gcc 重定向 printf 和 keil 不一样. 文件准备 先从以前的工程中拷过一份串口的代码来,然后在 main 函数中初始化串 ...

  3. STM32单片机串口中断+DMA使用(含CUBE配置)

    最近又要重新用32做点东西,发现一两年没怎么碰的结果就是,曾经熟得不行的东西都变得极度陌生,这种重新学习记忆的过程过于痛苦,果然还是要留下一些记录给之后失忆的自己的. 1.STM32CUBE配置 1. ...

  4. STM32串口——中断方式的一般配置方法

    #include "stm32f10x.h" /************************************************ 该程序讲解串口程序的一般配置方法: ...

  5. STM32F0_HAL库驱动描述——基于F1的USART串口IT中断实现解析

    从原子F103 HAL库基础串口例程来看HAL程序结构: 从main函数开始,首先是HAL库两个函数的初始化: HAL_Init(): Stm32_Clock_Init(RCC_PLL_MUL9); ...

  6. .gitignore文件配置:keil工程文件类型【转】

    本文转载自:https://blog.csdn.net/u010160335/article/details/80043965 .gitignore源文件下载链接:git管理keil工程.gitign ...

  7. STM32 使用 printf 发送数据配置方法 -- 串口 UART, JTAG SWO, JLINK RTT

    STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47 ...

  8. 第20章 USART—串口通讯

    本章参考资料:<STM32F76xxx参考手册>USART章节. 学习本章时,配合<STM32F76xxx参考手册>USART章节一起阅读,效果会更佳,特别是涉及到寄存器说明的 ...

  9. USART—串口通讯

    本章中主要讲解的是串口异步通讯,异步通讯中由于没有时钟信号, 所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码 . 串口通讯的一个数据包从起始信号开始,直到停止信号结束.数据 ...

随机推荐

  1. 梨子带你刷burp练兵场(burp Academy) - 服务端篇 - Sql注入配套漏洞讲解笔记

    目录 Sql注入 什么是Sql注入呢? Sql注入有哪些例子? 检索隐藏数据 打破应用逻辑 利用Union进行跨库查询 如何确定利用Union的注入攻击所需的列数呢? 如何确定Union的查询结果中哪 ...

  2. keras fit_generator 并行

    虽然已经走在 torch boy 的路上了, 还是把碰到的这个坑给记录一下 数据量较小时,我们可直接把整个数据集 load 到内存里,用 model.fit() 来拟合模型. 当数据集过大比如几十个 ...

  3. ysoserial Commons Collections2反序列化研究

    Apache Commons Collections2反序列化研究 环境准备 JDK 1.7 Commons Collections 4.0 javassit 前置知识 PriorityQueue() ...

  4. 关于谷歌浏览器不支持html5中audio的autoplay解决方法(js代码解决)

    当我们直接写autoplay时,在chrome中浏览器并没有自动播放音频: 如果直接通过js来调用audio的play()方法也不行: 控制台还会报错 大概意思:play()调用失败,因为用户没有与文 ...

  5. C++模板沉思录

    0 论抽象--前言 故事要从一个看起来非常简单的功能开始: 请计算两个数的和. 如果你对Python很熟悉,你一定会觉得:"哇!这太简单了!",然后写出以下代码: def Plus ...

  6. js animation & requestAnimationFrame

    js animation & requestAnimationFrame https://developer.mozilla.org/en-US/docs/Web/API/window/req ...

  7. js & bitwise-operators

    js & bitwise-operators 不用加减乘除运算符, 求整数的7倍 "use strict"; /** * * @author xgqfrms * @lice ...

  8. auto skip function args

    auto skip function args https://repl.it/@xgqfrms/auto-skip-function-args "use strict"; /** ...

  9. DoH & DNS over HTTPS

    DoH & DNS over HTTPS DNS over HTTPS(DoH)服务 http://mozilla.com.cn/thread-422231-1-1.html https:// ...

  10. 开发Microsoft Teams选项卡应用安全注意事项

    我们都知道,为了方便广大的开发人员快速开发Microsoft Teams选项卡应用,微软提供了一个JS SDK,你可以通过这里 https://docs.microsoft.com/en-us/jav ...