小弟刚开始学STM32,遇到点困难,请大家帮助一下。谢过!
程序是根据:1按键实验 2定时器实验 这两个实验修改
实现的功能:设置PA1,2,3,4,5,7,8,9,10,11,12,13.共12个通道为报警通道
如果通道为高电平,则显示right。。如果通道为低电平,延时2秒后,显示wrong。。
这个程序,我用寄存器版本,能够实现正常功能,用库函数,却不能实现
我感觉,是我写的定时器出错了。。大家帮我看下。
[mw_shl_code=c,true]int main(void)
{
u32 port[12];
u8 i;
u8 m=10;
delay_init(); //延时函数初始化
//uart_init(72,9600); //串口初始化为9600
//NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
IO_Init(); //初始化与按键连接的硬件接口
LCD_Init(); //初始化LCD屏
TIM3_Int_Init(199,7199); //10Khz的计数频率,计数到500为50ms
LCD_Clear(BLUE); //背景为蓝 {MOD}
while(1)
{
for(i=0;i<12;i++)
{
POINT_COLOR=BLACK; //字迹为黑 {MOD}
//t=port;
LCD_ShowString(20,(2*i+2)*m,40,16,16,"port");//LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *pLCD_ShowString(30,50,200,16,16,"WarShip STM32 ^_^");
LCD_ShowxNum(5*m,(2*i+2)*m,i+1,2,16,0);//LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode)
if(port==1)
{
POINT_COLOR=RED; //字迹为红 {MOD}
if(flag==0)
{
LCD_ShowString(68,(2*i+2)*m,40,16,16,"wrong");
}
}
else
{
POINT_COLOR=BLACK; //字迹为黑 {MOD}
LCD_ShowString(68,(2*i+2)*m,40,16,16,"right");
}
if(flag==1)
{
port=0;
POINT_COLOR=BLACK; //字迹为黑 {MOD}
LCD_ShowString(68,(2*i+2)*m,40,16,16,"right");
flag=0;
}
}
}
}
[/mw_shl_code]
[mw_shl_code=c,true]void IO_Init() //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15;//PA0,6,13,14,不用
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA1,2,3,4,5,7,8,9,10,11,12,15
}
//串口扫描函数
//12个串口.PA1-5作为通道1-5,PA7-12作为通道6-11 PA15作为通道12
//PA13.PA14为JTAG接口,保留不使用
void Port_Scan(void)
{
delay_ms(10);//去抖动
for(i=1;i<6;i++)
{
if(PAin(i)==0)
{
channel[i-1]++;
}
else
{
flag[i-1]=1;
}
}
for(i=7;i<13;i++)
{
if(PAin(i)==0)
{
channel[i-2]++;
}
else
{
flag[i-2]=1;
}
}
if(PAin(15)==0)
{
channel[11]++;
}
else
{
flag[11]=1;
}
}
[/mw_shl_code]
[mw_shl_code=c,true]void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
Port_Scan();
count++;
if(count>=20) //计时1s
{
second++;
count=0;
}
if(second>=2)//每两秒检测一次
{
Data_analyse();
second=0;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
}
}
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = 199; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =7199; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx
}
//定时器3中断服务程序
void Data_analyse()
{
u8 i;
for(i=0;i<12;i++)
{
if(channel==150)
{
port=1;
}
else
{
port=0;
}
channel=0;
}
}[/mw_shl_code]
一周热门 更多>