zoukankan      html  css  js  c++  java
  • 智林STM32程序源代码的分析和整理04(转帖)

    一、定时器的配置

    1、概述

       STM32的定时器功能比较多、配置也较复杂,我现在了解不多,边用边学吧。智林开发板上有两个用定时器的地方,一个是液晶的背光电源,要求输出一定的PWM波形,用于整流提供电源;二是用于控制喇叭,也是时钟脉冲输出。

       定时器首先的选择是计数、还是定时,我这里用的都是定时,输出模式可以是输入时定时器的捕获,可以是比较匹配时设定输出(经常用到这一种)。

    2、源程序

    void TIMx_Config(void) {

     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //时基单元配置数据结构

     TIM_OCInitTypeDef TIM_OCInitStructure; //输出模式设置数据结构

       /* PA2脚接着定时器2 CH3方波脉冲输出,该输出是液晶显示整流电源 */

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2,复用输出模式

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //即用于定时2 通道3

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

     GPIO_Init(GPIOA, &GPIO_InitStructure);

     /* 时基单元配置:TIM2计数频率=36MHz除以3=12MHz,输出频率=12MHz除以2倍周期值。*/

     TIM_TimeBaseStructure.TIM_Period = CCR3_Val; //40写入自动装载寄存器,150KHz输出。

     TIM_TimeBaseStructure.TIM_Prescaler = 2; //分频系数3

     TIM_TimeBaseStructure.TIM_ClockDivision = 0;//与什么采样相关,这里用不到

     //向上计数的特点是:从0到加载值,产生溢出;然后重新从0计数。

     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

     /* 输出比较模式配置: 通道3 */

     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //定时器计数与比较通道匹配时翻转

     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //开启输出通道

     TIM_OCInitStructure.TIM_Pulse = CCR3_Val; //比较通道的计数值

     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //低电平有效

     TIM_OC3Init(TIM2, &TIM_OCInitStructure);

     TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //自动重装载,预装载

     TIM_Cmd(TIM2, ENABLE);  /* TIM2定时器工作使能 */

    //TIM_ITConfig(TIM2, TIM_IT_CC3, ENABLE);/* 时钟中断使能 */

    }

     

    这里只列出了液晶使用的定时器2通道3的输出,输出150kHz的频率。没用到中断。这个频率是怎么得到的呢?首先是TIM2使用APB136M,经过预分频,分频系数为(Prescaler+1=33分频后为12MHz。计数周期为40,计数到40与输出比较寄存器产生匹配,触发输出翻转,然后计数器重新开始计数。故输出通道的频率为12MHz除以80,得到150kHz

    二、串口的配置

    按键输入命令不怎么方便,很快我就要编写串口通信程序,用串口输入命令,控制开发板。串口配置用库函数很方便。

    void UART_Config(void){ //进行串口的初始化配置

     USART_InitTypeDef USART_InitStructure;

     

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  /* UART的发送引脚 */

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

     GPIO_Init(GPIOA, &GPIO_InitStructure);

     

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;    /* UART的接收引脚 */

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

     GPIO_Init(GPIOA, &GPIO_InitStructure);

     USART_InitStructure.USART_BaudRate = 115200;       //波特率

     USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8

     USART_InitStructure.USART_StopBits = USART_StopBits_1;  //停止位1

     USART_InitStructure.USART_Parity = USART_Parity_No ; //无奇偶校验

     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控

     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送、接受模式有效

     

     USART_Init(USART1, &USART_InitStructure);      /* 根据上面结构的参数对串口1进行初始化 */ 

     USART1->BRR =0x0271;     /* 库函数的串口波特率计算有些问题,这里重新计算了一下 */

     USART_Cmd(USART1, ENABLE);    /* 使能串口1 */

    }

  • 相关阅读:
    C#中任意类型数据转成JSON格式
    数据库用户映射到SQL Server登录名
    浅述WinForm多线程编程与Control.Invoke的应用
    Git错误一例
    提高VS2010/VS2012编译速度
    给有兴趣、有责任要讲课、分享的朋友推荐两本书
    中国剩余定理
    中国剩余定理
    洛谷1546 最短网路
    洛谷1111 修复公路
  • 原文地址:https://www.cnblogs.com/ddlzq/p/1593279.html
Copyright © 2011-2022 走看看