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—串口通讯
本章中主要讲解的是串口异步通讯,异步通讯中由于没有时钟信号, 所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码 . 串口通讯的一个数据包从起始信号开始,直到停止信号结束.数据 ...
随机推荐
- c# grpc
刚接触RPC时只知道概念是远程过程调用协议,分为服务端和客户端,客户端请求服务端,服务端再回应客户端,粗看和HTTP一应一答没有什么区别.既然有着存在即合理的说法,网上找找说法,有的讲的太深感觉太啰嗦 ...
- [Golang]-6 超时处理、非阻塞通道操作、通道的关闭和遍历
目录 超时处理 非阻塞通道操作 通道的关闭 通道遍历 超时处理 超时 对于一个连接外部资源,或者其它一些需要花费执行时间的操作的程序而言是很重要的. 得益于通道和 select,在 Go中实现超时操作 ...
- K8S(09)交付实战-通过流水线构建dubbo服务
k8s交付实战-流水线构建dubbo服务 目录 k8s交付实战-流水线构建dubbo服务 1 jenkins流水线准备工作 1.1 参数构建要点 1.2 创建流水线 1.2.1 创建流水线 1.2.2 ...
- codeforces 6D
D. Lizards and Basements 2 time limit per test 2 seconds memory limit per test 64 megabytes input st ...
- MacOS微信逆向分析-Frida
MacOS微信逆向分析-Frida 0.前言 PC下的微信二次开发相信大家都会了,那么本篇文章将带领大家使用Frida框架对Mac下微信来进行二次开发! PS:还有一种静态注入的方式也不错,但是考虑到 ...
- 十三香 & 香料
十三香 & 香料 十三香原料组成不完全一致, 但有一些香料却是大家都会采用的: 草蔻.砂仁.肉豆蔻.肉桂.丁香. 花椒.大料.小茴香.木香.白芷. 山萘.良姜和姜 王守义十三香 http:// ...
- Redis 大 key 问题 & 问题分析 & 解决方案
Redis 大 key 问题 & 问题分析 & 解决方案 Redis 什么是 Redis 大 key 单个key 存储的 value 很大 hash, set,zset,list 结构 ...
- ODM & mongoose
ODM & mongoose ODM (object data modeling) https://mongoosejs.com/ MongoDB NoSQL xgqfrms 2012-202 ...
- Event Bus & Event Emitter
Event Bus & Event Emitter Event Bus https://code.luasoftware.com/tutorials/vuejs/parent-call-chi ...
- uniapp 创建简单的tabs
tabs组件 <template> <view class="tabs"> <view class="bar" :style=&q ...