STM32F103VET6-keil工程配置-USART串口中断
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串口中断的更多相关文章
- 第20章 USART—串口通讯—零死角玩转STM32-F429系列
第20章 USART—串口通讯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...
- 使用 VSCode 给STM32配置一个串口 printf 工程
使用 VSCode 给STM32配置一个串口 printf 工程 gcc 重定向 printf 和 keil 不一样. 文件准备 先从以前的工程中拷过一份串口的代码来,然后在 main 函数中初始化串 ...
- STM32单片机串口中断+DMA使用(含CUBE配置)
最近又要重新用32做点东西,发现一两年没怎么碰的结果就是,曾经熟得不行的东西都变得极度陌生,这种重新学习记忆的过程过于痛苦,果然还是要留下一些记录给之后失忆的自己的. 1.STM32CUBE配置 1. ...
- STM32串口——中断方式的一般配置方法
#include "stm32f10x.h" /************************************************ 该程序讲解串口程序的一般配置方法: ...
- STM32F0_HAL库驱动描述——基于F1的USART串口IT中断实现解析
从原子F103 HAL库基础串口例程来看HAL程序结构: 从main函数开始,首先是HAL库两个函数的初始化: HAL_Init(): Stm32_Clock_Init(RCC_PLL_MUL9); ...
- .gitignore文件配置:keil工程文件类型【转】
本文转载自:https://blog.csdn.net/u010160335/article/details/80043965 .gitignore源文件下载链接:git管理keil工程.gitign ...
- STM32 使用 printf 发送数据配置方法 -- 串口 UART, JTAG SWO, JLINK RTT
STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47 ...
- 第20章 USART—串口通讯
本章参考资料:<STM32F76xxx参考手册>USART章节. 学习本章时,配合<STM32F76xxx参考手册>USART章节一起阅读,效果会更佳,特别是涉及到寄存器说明的 ...
- USART—串口通讯
本章中主要讲解的是串口异步通讯,异步通讯中由于没有时钟信号, 所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码 . 串口通讯的一个数据包从起始信号开始,直到停止信号结束.数据 ...
随机推荐
- Centos 7 安装nginx指定版本
官方版本列表:http://nginx.org/download/ 1.安装 wget http://nginx.org/download/nginx-1.10.3.tar.gz tar -zxvf ...
- Zabbix 监控 SNMP & JMX
Zabbix 配置清华源 # 安装清华源 yum 仓库 [root@db01 ~]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabb ...
- codeforces 920E(非原创)
E. Connected Components? time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- IP的地址的划分
IP地址的划分是计算机网络中很重要的一个知识点,曾经考过三级,但是长时间不用就会忘掉,现在重新将IP的地址划分整理一遍. 首先IP地址的编址方法经历了三个阶段:分类的IP地址.子网的划分.构成超网 我 ...
- pikachu-反射性xss(get)
首先打开漏洞网页,发现输入的长度好像被限制了, 我们便F12查看源代码,发现长度被限制成了20,而且还是前端验证的,我们可以直接修改为100 在我们的输入框中,输入 <script>ale ...
- Python爬虫全网搜索并下载音乐
现在写一篇博客总是喜欢先谈需求或者本内容的应用场景,是的,如果写出来的东西没有任何应用价值,确实也没有实际意义.今天的最早的需求是来自于如何免费[白嫖]下载全网优质音乐,我去b站上面搜索到了一个大牛做 ...
- μC/OS-III---I笔记1---概述
在裸板上跑一些程序对于一些电子设计是足够的,所谓裸板上的程序就是传统的前后台系统,而我的理解它应该是一种"过程类"的程序,一个大循环(作为后台)做一些处理,中断程序(作为前台)来处 ...
- 如何使用 Python 编写后端 API 接口
如何使用 Python 编写后端 API 接口 get API Python3 # coding:utf-8 import json # ModuleNotFoundError: No module ...
- 微信小程序 HTTP API
微信小程序 HTTP API promise API https://www.npmtrends.com/node-fetch-vs-got-vs-axios-vs-superagent node-f ...
- CSP & CORS
CSP & CORS 内容安全策略 跨域资源共享 CSP https://developers.google.com/web/fundamentals/security/csp google ...