最近受疫情影响导致我莫得办法出去玩,打游戏一不小心又给打通关了就只能找点东西玩玩了,所以就有了下面这篇文章。。。。。。搞这个东西的时候遇见一些好玩的问题,我写在第6部分,希望能帮到看到这篇小文章的同志们。
1.硬件平台:stm32f103zet6,正点原子的精英板
2.使用到的硬件:定时器3,定时器5,串口1,按键
3.描述:使用定时器3产生一个pwm波,占空比可通过串口调试助手调整。把pwm波通过IO和杜邦线输入到定时器5的输入捕获通道以测量pwm波的高电平持续时间,单位为us
4.主要代码
(1).main.c
//1.main.c
#include "stm32f10x.h"
#include "timer.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
timer3_ch2_pwm_out(999,7199);//定时器2时钟10khz,溢出时间为100ms,pwm波周期为100ms
TIM_SetCompare2(TIM3,499);//占空比50%,高电平时间为50ms
timer5_ch1_capture(0XFFFF,71);//定时器3时钟1Mhz,记一个数为1us,溢出时间为65536us
while(1)
{
if(USART_RX_STA&0x8000)
{
USART_RX_STA=0;//请注意这里,当字符串接收完成后(即USART_RX_STA&0x8000=1,在system下的usart.c内有相关代码)请在接收中断函数或main内将USART_RX_STA置零,否则将无法完成下次接收
}
//一般情况下在这里都会写个delay_ms(10),但是这里延时之后会导致上面的if来不及执行,就会使得无法完成下次的串口接收
}
}
(2).timer.c
#include "timer.h"
#include "sys.h"
void timer3_ch2_pwm_out(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitType;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitType;
TIM_OCInitTypeDef TIM_OCInitType;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);//部分重映射对应PB5,完全重映射对应PC7,不映射对应PA7,但是PA7并不能生成PWM波,其余两个都可以
GPIO_InitType.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitType.GPIO_Pin=GPIO_Pin_7;
GPIO_InitType.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitType);
TIM_TimeBaseInitType.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitType.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitType.TIM_Period=arr;
TIM_TimeBaseInitType.TIM_Prescaler=psc;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitType);
TIM_OCInitType.TIM_OCMode=TIM_OCMode_PWM2;
TIM_OCInitType.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitType.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC2Init(TIM3,&TIM_OCInitType);
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3,ENABLE);//使占空比的调整在本周期立即生效
TIM_Cmd(TIM3,ENABLE)</