初级会员

- 积分
- 50
- 金钱
- 50
- 注册时间
- 2021-4-28
- 在线时间
- 16 小时
|

楼主 |
发表于 2022-7-22 16:10:00
|
显示全部楼层
//STM32单片机控制LCD1602,在LCD1602的第一行显示测量值val
#include "stdio.h"
#include "stm32f10x_tim.h"
#include "stm32f10x.h"
void RCC_Configration(void);
void GPIO_Configration(void);
void NVIC_Configration(void);
u8 Table2[8]; //字符串数组全局变量定义
float PD;
float Freq;
float IC2_CCR1;
float IC2_CCR2;
void RCC_Configration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//打开TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);//使能PA,PB,PC端口时钟
}
void GPIO_Configration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //设定TIM3的CH2对应引脚PA9为PWM捕获输入端
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; //LCD1602的三根控制线rs,rw,en
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数初始化GPIOC
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//LCD1602的8跟数据线
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure);//根据设定参数初始化GPIOB
}
void NVIC_Configration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //开启TIM1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从优先级0级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}
/*******************主函数************************/
int main(void)
{
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_Configration( );
NVIC_Configration( );
GPIO_Configration( );
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //选择TIM3的通道2
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //IC1直接连接TI2FP2
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //对输入的PWM信号不分频
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);//选择输入捕获的触发信号;
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // 选择从模式
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); // PWM输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器CNT被复位清零;
TIM_Cmd(TIM3, ENABLE);// 计数器开始计数
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE); // 开启2通道CC2中断,这个中断针对主捕获通道(TI2FP2)
while(1)
{
u8 i,j;
u8 table1[ ]="PD:" ;
delay_init();//延时函数初始化
LCD1602_Init();//LCD1602初始化函数
sprintf(Table2,"%.2f",PD);//将浮点数PD转换为字符串函数,保留2位小数
while(1)
{
LCD_Write_Command(0x80);//第一行的首地址
for(i=0;i<3;i++)
{
delay_ms(10);//延时很重要,否则第一个字符会丢掉
LCD_Write_Date(table1[i]);
delay_ms(5);
}
LCD_Write_Command(0x84);
for(j=0;j<5;j++)
{
delay_ms(5);
LCD_Write_Date(Table2[j]);
delay_ms(5);
}
}
}
}
void TIM3_IRQHandler(void)//中断处理程序
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//TIM_ClearITPendingBit(TIM3,TIM_IT_CC2)
IC2_CCR1 = TIM_GetCapture1(TIM3); //获取周期值CCR1
IC2_CCR2 = TIM_GetCapture2(TIM3); //获取高电平时间CCR2
if(IC2_CCR2!=0)
{
PD = ((IC2_CCR1+1)* 100)/(IC2_CCR2+1)*180;
}
else
{
Freq=0;
PD=0;
}
}
这是我写的程序,搞了好几天了,捕获的脉冲数据始终是0。跪求各位大佬帮我看看,问题到底在哪里? |
|