2019年9月12日星期四(STM32)

.定时器

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)开启定时器14GPIOF的时钟

    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_OCMode;        /*!< 
输出模式 PWM1/PWM2(和极性,定时器计数方式共同决定波形高电平顺序)*/

  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_OCInitTypeDef;

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
{
  uint32_t USART_BaudRate;            /*!<
波特率115200 */

  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_Mode;                /*!< 
传输方式 USART_Mode_Rx|USART_Mode_Tx @ref USART_Mode */

  uint16_t USART_HardwareFlowControl; /*!< 硬件流控制 USART_HardwareFlowControl_None @ref USART_Hardware_Flow_Control */
} USART_InitTypeDef;

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);

}

猜你喜欢

转载自www.cnblogs.com/zjlbk/p/11529562.html
今日推荐