PA12引腳的下降沿觸發(fā)將會(huì)觸發(fā)中斷,進(jìn)入函數(shù)EXTI15_10_IRQHandler,此時(shí)在函數(shù)中調(diào)用HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12)表示查看PA12的值,如果符合條件,則觸發(fā)HAL_GPIO_EXTI_Callback函數(shù)。代碼如下
void?HAL_GPIO_EXTI_Callback(uint16_t?GPIO_Pin){??
if?(GPIO_Pin?==?GPIO_PIN_12){??
PA12flag?=?1;??
PA12cnt++;??
}else{??
UNUSED(GPIO_Pin);??
}??
} ?
在main函數(shù)的while循環(huán)中添加代碼:
if(PA12flag?==?1){??
PA12flag?=?0;??
size?=?sprint(str,?”Count:?%d ”,PA12cnt);??
HAL_UART_Transmit(&UartHandle,?(uint8_t*)str,?size,?500);??
} ?
5. 編寫Cube程序,開(kāi)啟定時(shí)器為200ms中斷一次,中斷觸發(fā)時(shí)設(shè)置標(biāo)識(shí),主循環(huán)根據(jù)這個(gè)標(biāo)識(shí)來(lái)做串口輸出(取消4 的串口輸出);
使用TIM3定時(shí)器,如果不是CUBEMX生成代碼的話記得添加頭文件引用。
添加init函數(shù):
void?TIM_Init(){??
TIM_Handle.Instance?=?TIM3;??
TIM_Handle.Init.Prescaler?=?8000;??
TIM_Handle.Init.CounterMode?=?TIM_COUNTERMODE_UP;??
TIM_Handle.Init.Period?=?199;??
TIM_Handle.Init.ClockDivision?=?TIM_CLOCKDIVISION_DIV1;??
HAL_TIM_Base_Init(&TIM_Handle);??
sClockSourceConfig.ClockSource?=?TIM_CLOCKSOURCE_INTERNAL;?//設(shè)置時(shí)鐘源為內(nèi)部時(shí)鐘??
HAL_TIM_ConfigClockSource(&TIM_Handle,?&sClockSourceConfig);??
sMasterConfig.MasterOutputTrigger?=?TIM_TRGO_RESET;//設(shè)置復(fù)位模式,發(fā)生觸發(fā)輸入事件時(shí)計(jì)數(shù)器和預(yù)分頻器能重新初始化??
sMasterConfig.MasterSlaveMode?=?TIM_MASTERSLAVEMODE_DISABLE;??
HAL_TIMEx_MasterConfigSynchronization(&TIM_Handle,?&sMasterConfig);??
HAL_NVIC_SetPriority(TIM3_IRQn,?0,?0);//設(shè)置優(yōu)先級(jí)??
HAL_NVIC_EnableIRQ(TIM3_IRQn);enable中斷向量表處理????
}??
和之前設(shè)置的中斷一樣需要覆寫中斷觸發(fā)函數(shù)TIM3_IRQHandler,而后在其中對(duì)時(shí)鐘進(jìn)行判斷后觸發(fā)HAL_TIM_PeriodElapsedCallback。并在callback中實(shí)現(xiàn)操作。
TIM_HandleTypeDef?TIM_Handle;??
TIM_ClockConfigTypeDef?sClockSourceConfig;??
TIM_MasterConfigTypeDef?sMasterConfig;?????
int?TIMflag?=?0,?PA12flag?=?0;??
int?TIMcnt?=?0,?PA12cnt?=?0,?totalcnt?=?0;??
void?TIM3_IRQHandler(void){??
HAL_TIM_IRQHandler(&TIM_Handle);??
}??
void?HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef?*htim){?????
TIMflag?=?1;??
TIMcnt++;??
} ?
6. 編寫完整的碼表程序,PA12的按鈕表示車輪轉(zhuǎn)了一圈,通過(guò)計(jì)數(shù)器可以得到里程,通過(guò)定時(shí)器中斷得到的時(shí)間可以計(jì)算出速度;PA11的按鈕切換模式,模式一在串口輸出里程,模式二在串口輸出速度。
在main函數(shù)中實(shí)現(xiàn)碼表程序:
while?(1)??
{??
/*?USER?CODE?END?WHILE?*/??
/*?USER?CODE?BEGIN?3?*/??
if(TIMflag?==?1){??
TIMflag?=?0;??
if(TIMcnt?==?5){每五個(gè)周期輸出一次??
speed?=?2?*?PA12cnt?/?1;//五個(gè)周期為1秒,車輪周長(zhǎng)2米??
6. 編寫完整的碼表程序,PA12的按鈕表示車輪轉(zhuǎn)了一圈,通過(guò)計(jì)數(shù)器可以得到里程,通過(guò)定時(shí)器中斷得到的時(shí)間可以計(jì)算出速度;PA11的按鈕切換模式,模式一在串口輸出里程,模式二在串口輸出速度。
在main函數(shù)中實(shí)現(xiàn)碼表程序:
[cpp] view plain copywhile (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(TIMflag == 1){
TIMflag = 0;
if(TIMcnt == 5){每五個(gè)周期輸出一次
speed = 2 * PA12cnt / 1;//五個(gè)周期為1秒,車輪周長(zhǎng)2米
TIMcnt = 0;
if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11))
mode = 1 - mode;//PA11按鈕負(fù)責(zé)模式切換
switch(mode){
case 0:
size = sprintf(str, “Speed : %f ”,speed);//輸出速度
HAL_UART_Transmit(&UartHandle, (uint8_t*)str, size, 500);
break;
case 1:
size = sprintf(str, “Mileage: %d ”, 2 * totalcnt);//輸出里程
HAL_UART_Transmit(&UartHandle, (uint8_t*)str, size, 500);
break;
default:break;
}
PA12cnt = 0;
} }
評(píng)論