求助,003j4m6只能中斷一次

mcu:ch32v003j4m6


于Pin5/6引腳連接了一個TM1650,Pin7上連接了TM1650的按鍵中斷輸出,當(dāng)前代碼能進入中斷,讀取到按鍵值。


但,僅能中斷一次,第二次按鍵就無法產(chǎn)生中斷。


請看代碼如下:


初始化代碼
void?TM1650_Init(void)
{
GPIO_InitTypeDef?GPIO_InitStructure?=
{?0?};
EXTI_InitTypeDef?EXTI_InitStructure?=
{?0?};
NVIC_InitTypeDef?NVIC_InitStructure?=
{?0?};
//?Configure?PC1(SDA)?and?PC2(SCL)?as?output
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO?|?RCC_APB2Periph_GPIOC,?ENABLE);
GPIO_InitStructure.GPIO_Pin?=?GPIO_Pin_1?|?GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed?=?GPIO_Speed_50MHz;
GPIO_Init(GPIOC,?&GPIO_InitStructure);
//?Configure?PC4?as?input?for?key?interrupt
GPIO_InitStructure.GPIO_Pin?=?GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_IPU;
GPIO_Init(GPIOC,?&GPIO_InitStructure);
//?Configure?EXTI?for?PC4
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,?GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line?=?EXTI_Line4;
EXTI_InitStructure.EXTI_Mode?=?EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger?=?EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd?=?ENABLE;
EXTI_Init(&EXTI_InitStructure);
//?Configure?NVIC?for?EXTI7_0
NVIC_InitStructure.NVIC_IRQChannel?=?EXTI7_0_IRQn;?//?Changed?from?EXTI4_IRQn?to?EXTI7_0_IRQn
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority?=?1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority?=?2;
NVIC_InitStructure.NVIC_IRQChannelCmd?=?ENABLE;
NVIC_Init(&NVIC_InitStructure);
//?Initialize?TM1650
GPIO_SetBits(GPIOC,?GPIO_Pin_1);????//?SDA?High
GPIO_SetBits(GPIOC,?GPIO_Pin_2);????//?SCL?High
Delay_Ms(500);
TM1650_SetSystem(0x00,?0x08,?0x00,?0x01);//?1級亮度+7段模式+正常工作模式+開顯示
Delay_Ms(10);
TM1650_WriteDIG(0x68,?0);
TM1650_WriteDIG(0x6A,?11);
TM1650_WriteDIG(0x6C,?11);
TM1650_WriteDIG(0x6E,?11);
}


中斷代碼
void?EXTI7_0_IRQHandler(void)?__attribute__((interrupt("WCH-Interrupt-fast")));
//?EXTI7_0?Interrupt?Handler?for?TM1650?Key
void?EXTI7_0_IRQHandler(void)?//?Changed?from?EXTI4_IRQHandler?to?EXTI7_0_IRQHandler
{
if?(EXTI_GetITStatus(EXTI_Line4)?!=?RESET)
{
uint8_t?key_value?=?TM1650_ReadKey();
UART_Send_Info(key_value);
EXTI_ClearITPendingBit(EXTI_Line4);
}
}



您好,我這邊根據(jù)你的代碼大概測試了一下,PC4外部中斷這部分代碼是沒有問題的,如下圖,可以多次進入中斷。估計可能是卡在中斷uint8_t?key_value?=?TM1650_ReadKey();或UART_Send_Info(key_value);某一段函數(shù)中了,你可以將這兩段函數(shù)依次注釋掉試一下,是否還會只進一次中斷。若無法解決問題,可將你的完整工程發(fā)我郵箱(lzs@wch.cn)具體看一下。

image.png


這是讀取代碼。
uint8_t?TM1650_ReadKey(void)
{
	uint8_t?key;
	I2C_Start();
	I2C_WriteByte(0x49);	//?Read?Key?Command
	I2C_WAck();
	key?=?I2C_ReadByte(0);	//?Read?Key?Data
	I2C_WAck();
	I2C_Stop();
	return?key;
}
因為j4m6只有串口和swd二選一,我只能這樣發(fā)送數(shù)據(jù)用來debug
void?UART_Send_Info(uint8_t?DebugData)
{
	while(USART_GetFlagStatus(USART1,?USART_FLAG_TC)?==?RESET);
	USART_SendData(USART1,?0x3C);

	while(USART_GetFlagStatus(USART1,?USART_FLAG_TC)?==?RESET);
	USART_SendData(USART1,?DebugData);

	while(USART_GetFlagStatus(USART1,?USART_FLAG_TC)?==?RESET);
	USART_SendData(USART1,?0x3E);
}

完整工程代碼已經(jīng)發(fā)送到郵箱。


您好,已郵件回復(fù),注意串口TX引腳PD5為合封引腳,使用時注意相關(guān)配置,具體見郵件附件例程。


確實Pin7的中斷功能沒有問題,最終應(yīng)該是UART_Send_Info(key_value);這個語句導(dǎo)致了某種奇怪的事情發(fā)生。

現(xiàn)在把這句修改掉,讀取到的鍵值扔變量里邊,再處理出來給tm1650點led,測試中斷完全沒問題了。


希望sop8能把swd功能放到其他引腳上,比如Pin7這個功能重復(fù)比較少的引腳,沒有調(diào)試功能太難受了。


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频