基础理论知识(stm32f103c8t6)
一、cubeMx界面:
1、介绍:
左侧是MCU的外设选择界面,在这里选择使用的MCU外设资源有两种排序方式:Categories 种类选择 、 A-Z 顺序选择
中间是是详细的外设配置界面,关于每个外设的详细参数都在这里配置
右侧是芯片设置预览界面,预览每个引脚在什么位置和配置了什么功能
2、配置
2.1淡黄色表示为不可配置引脚,电源专用引脚以淡黄色突出显示。
橙色表示配置了一个I/O口的功能,但是没有初始化相对应的外设功能
绿色表示配置成功
2.2推荐将RCC时钟配置外部晶振:
如果不配置RCC时钟,则是默认使用内部高速时钟(HSI),这也将影响之后时钟树的配置。
RCC时钟参数(Reset and Clock Control)复位和时钟控制
HSE 高速外部时钟
LSE 低速外部时钟
Crystal/Ceramic Resonator(晶体/陶瓷谐振器):使用外部晶振作为时钟源
2.3配置SYS参数
ST-Link采用的是SW调试接口,选择Serial Wire (使用SWD协议下载和调试);
如果使用J-Link 但是采用SWD协议,也可以选择Trace Asynchronous Sw ;
Trace Asynchronous Sw 模式有时候也可以解决使用ST-Link 烧录之后无法烧录和调试的情况
System Wake-Up :
设置低功耗模式下的自动唤醒功能,通过引脚PA0。
配置PLL锁相环,之后倍频更改系统主时钟
Timebase Source :
一般指HAL的时基,即HAL库中的uwTick,用于实现HAL_Delay()以及作为各种timeout时钟的基准。
一般情况下直接选择默认的Sys Tick(嘀嗒定时器)来维护SYS Timebase Source即可,即直接放在SysTick_Handler()中断服务函数中,也就是HAL_IncTick()函数。
2.4配置时钟树
2.5建立工程
1、选择工程存放路径
2、将Toolchain/IDE配置位MDK-ARM
3、勾选 Generate '.c/.h' files
二、DMA(直接储存器访问)
DMA传输,数据搬运工 内存到外设,外设到内存,内存到内存
无需CPU直接控制传输,也没有中断处理那样保留现场和恢复现场过程,通过硬件为RMA和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高
1、DMA请求
DMA传输数据,先向DMA控制器发送请求
DMA通道不同外设向DMA的不同通道发送请求DMA1有7个通道,DMA2有5个通道
2、DMA优先级
多个DMA通道同时发来请求时,就有先后响应处理的顺序问题,这个由仲裁器管理(优先级管理也分软件阶段和硬件阶段
3、DMA就是建立数据传输通道
外设想通过DMA发送数据,先发送请求
DMA控制器收到请求后,给外设一个ack
外设收到ack后,释放请求
外设启动DMA数据传输,直至传输结束
4、仲裁器管理DMA通道请求分为两个阶段:软件阶段(1)、硬件阶段(2)
第一阶段(软件阶段):每个通道的优先级可在DMACCRx寄存器中设置,有四个等级:最高、中和低优先级。
第二阶段(硬件阶段):如果两个请求有相同软件优先级,较低编号的通道比较高编号的通道有较高的优先级。
(大容量芯片中,DMA1控制器拥有高于DMA2控制器的优先级)
注意:多个请求通过逻辑或输入到DMA控制器,只能有一个请求有效。
USART2_RX: Memory to Peripheral : 内存向外设搬运
USART2_TX: Peripheral to Memory : 外设向内存搬运
三、串口中断
串口中断是指当单片机收到一个串口数据时,单片机会产生一个中断信号,通知处理器中断服务程序去处理这个接收到的数据。
STM32是一款广泛使用的微控制器,其串口使用函数如下:
1. 初始化串口:HAL_UART_Init()
该函数用于初始化UART或USART外设,它接受一个UART_HandleTypeDef结构体类型的参数,该结构体包含了UART的配置信息,例如波特率、数据位数、停止位数、校验方式等。
2. 发送数据:HAL_UART_Transmit()
该函数用于向串口发送数据,它接受三个参数:UART_HandleTypeDef结构体类型的指针、发送缓冲区指针和发送数据长度。
3. 接收数据:HAL_UART_Receive()
该函数用于从串口接收数据,它接受三个参数:UART_HandleTypeDef结构体类型的指针、接收缓冲区指针和接收数据长度。
4. 发送字符串:HAL_UART_Transmit()
该函数可以用于向串口发送字符串,只需要将字符串的地址和长度作为参数传入即可。
5. 接收字符串:HAL_UART_Receive()
该函数可以用于从串口接收字符串,只需要将接收缓冲区的地址和长度作为参数传入即可。
6. 中断方式发送数据:HAL_UART_Transmit_IT()
该函数用于以中断的方式向串口发送数据,它接受三个参数:UART_HandleTypeDef结构体类型的指针、发送缓冲区指针和发送数据长度。
7. 中断方式接收数据:HAL_UART_Receive_IT()
该函数用于以中断的方式从串口接收数据,它接受三个参数:UART_HandleTypeDef结构体类型的指针、接收缓冲区指针和接收数据长度。
//定时器的中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
}
}
Mode:Asynchronous异步通信