2019年9月12日星期四(STM32 pwm 串口 )
一.定时器
1.PWM
PWM脉冲宽度调制(Pulse Width Modulation)是通过微处理器的数字输出(高低电平)来对模拟电路进行控制的一种非常有效的技术,在测量,通信和功率控制等领域被广泛使用
占空比 - 在规定时间内,有效电平所占的比例
2.stm32通用定时器有PWM功能
通用定时器可以和GPIO口配合,通过GPIO输出PWM波形,定时器的周期就是PWM波的周期,PWM波的电平改变时间通过定时器的比较计数器来决定
PWM波的波形由周期(定时器周期),极性(配置),占空比(比较计数器)共同决定
PWM波是通过GPIO输出,属于GPIO的复用输出功能,需要配置GPIO的复用映射(选择对应的复用功能)
3.GPIO的功能复用
参考手册中所有的GPIO都与16个复用功能,通过寄存器配置对应的复用功能,但是实际上芯片每个IO口的复用功能没有这么多,要根据原理图(具体芯片手册)来查询每隔IO口有哪些复用功能,根据查询结果去配置寄存器
4.PWM定时器编程方法(LED1呼吸灯为例)
(1)开启定时器14和GPIOF的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
....
(2)初始化PF9为复用输出功能
GPIO_Init();
//GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//复用模式
(3)将PF9复用映射到TIM14
GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);
(4)初始化定时器
TIM_TimeBaseInit();
(5)初始化定时器比较参数
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
参数:
TIMx - 哪个定时器
TIM_OCInitStruct - 初始化结构
typedef struct uint16_t TIM_OutputState; /*!< 输出状态使能 TIM_OutputState_Enable @ref TIM_Output_Compare_State */ uint32_t TIM_Pulse; /*!< 初始比较计数值 between 0x0000 and 0xFFFF */
uint16_t TIM_OCPolarity; /*!< 极性电平 TIM_OCPolarity_Low @ref
TIM_Output_Compare_Polarity */ |
(6)使能预装在寄存器
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
(7)使能自动重装载允许位
TIM_ARRPreloadConfig(TIM14, ENABLE);
(8)使能定时器
TIM_Cmd(...);
(9)修改比较值寄存器(CCRx),实现占空比调节
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1)
参数:
TIMx - 哪个定时器
Compare1 - 新的比较值
二.串口编程
1.通信的基本概念
(1)并行通信和串行通信
并行通信利用多条数据线将多位二进制数据同时传送
串行通信利用一根数据线一次传输一位二进制位(比特位)
(2)通信方式
单工 ----- 数据只能沿着一个方向传输(单向传输)
半双工 ---- 数据可以双向传输,但是不可以同时进行(某个时间点只能单向传输)
全双工 ---- 在同一个时间点数据可以双向传输
(3)数据帧(协议)
(4)串口交叉连接
(5)串口使用波特率(bps)表示传输速率 ------ 单位时间内传输的比特位数
2.stm32串口
串行,全双工
数据线有两根: TXD(发送) RXD(接收)
(1)原理图
最终连接到了CPU的PA9 PA10
(2)查看stm32的芯片手册
特性:
3.串口配置的编程方法
(1)使能GPIOA,串口1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
...
(2)初始化GPIO为复用功能
GPIO_Init(...)
(3)将PA9 PA10映射为串口功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, .......);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, .......);
(4)
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
参数:
USARTx - 哪个串口
USART_InitStruct - 初始化结构体
typedef
struct uint16_t USART_WordLength; /*!< 数据位长度 USART_WordLength_8b @ref USART_Word_Length */ uint16_t USART_StopBits; /*!< 停止位长度 USART_StopBits_1 @ref USART_Stop_Bits */
uint16_t
USART_Parity;
/*!< 校验方式 USART_Parity_No @ref USART_Parity*/
uint16_t USART_HardwareFlowControl; /*!< 硬件流控制 USART_HardwareFlowControl_None @ref USART_Hardware_Flow_Control */ |
(5)如果需要使用串口中断,初始化中断源和NVIC
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);;//接收中断
NVIC_Init(...);
(6)使能串口
USART_Cmd(USART1,ENABLE);
(7)发送和接收数据 ---------- (轮询中断 DMA)
轮询发送:
void usart1_putc(u8 data) { //等待上一个数据是否发送完成 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); // 发送数据 USART_SendData(USART1,data); } |