PWM脉冲宽度调制(Pulse Width Modulation)是通过微处理器的数字输出(高低电平)来对模拟电路进行控制的一种非常有效的技术,在测量,通信和功率控制等领域被广泛使用
占空比 - 在规定时间内,有效电平所占的比例
通用定时器可以和GPIO口配合,通过GPIO输出PWM波形,定时器的周期就是PWM波的周期,PWM波的电平改变时间通过定时器的比较计数器来决定
PWM波的波形由周期(定时器周期),极性(配置),占空比(比较计数器)共同决定
PWM波是通过GPIO输出,属于GPIO的复用输出功能,需要配置GPIO的复用映射(选择对应的复用功能)
参考手册中所有的GPIO都与16个复用功能,通过寄存器配置对应的复用功能,但是实际上芯片每个IO口的复用功能没有这么多,要根据原理图(具体芯片手册)来查询每隔IO口有哪些复用功能,根据查询结果去配置寄存器
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
....
GPIO_Init();
//GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//复用模式
GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);
TIM_TimeBaseInit();
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 */ |
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM14, ENABLE);
TIM_Cmd(...);
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1)
参数:
TIMx - 哪个定时器
Compare1 - 新的比较值
并行通信利用多条数据线将多位二进制数据同时传送
串行通信利用一根数据线一次传输一位二进制位(比特位)
单工 ----- 数据只能沿着一个方向传输(单向传输)
半双工 ---- 数据可以双向传输,但是不可以同时进行(某个时间点只能单向传输)
全双工 ---- 在同一个时间点数据可以双向传输
串行,全双工
数据线有两根: TXD(发送) RXD(接收)
最终连接到了CPU的PA9 PA10
特性:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
...
GPIO_Init(...)
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, .......);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, .......);
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 */ |
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);;//接收中断
NVIC_Init(...);
USART_Cmd(USART1,ENABLE);
轮询发送:
void usart1_putc(u8 data) { //等待上一个数据是否发送完成 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); // 发送数据 USART_SendData(USART1,data); } |
原文:https://www.cnblogs.com/zjlbk/p/11529562.html