0 / 0 / 0
Регистрация: 06.12.2008
Сообщений: 40
|
|
1 | |
STM32F407 внешнее прерывание06.07.2012, 21:09. Просмотров 7242. Ответов 5
Метки нет Все метки)
(
Осваиваю данный контроллер. Читать состояние кнопки и светиками моргать научился быстро. Проблема наметилась с внешним прерыванием EXTI. Собрал код по примеру с библиотеки. Как не странно, но не хочет работать. Кнопка подключена напрямую с земли к порту, без внешней подтяжки. Ставлю внутреннюю Pull Up. Опрос состояния кнопки таким же образом работает, а вот прерывание нет.
Код
/* Includes */ #include "stm32f4xx.h" #include "main.h" static __IO uint32_t TimingDelay; void Delay(__IO uint32_t nTime); void TimingDelay_Decrement(void); RCC_ClocksTypeDef RCC_Clocks; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; USORT_InitTypeDef USORT_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; void Init_USORT(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_USORT3, ENABLE); /* Confikure USORT */ USORT_DeInit(USORT3); USORT_InitStructure.USORT_BaudRate = 115200; USORT_InitStructure.USORT_WordLength = USORT_WordLength_8b; USORT_InitStructure.USORT_StopByts = USORT_StopByts_1; USORT_InitStructure.USORT_Parity = USORT_Parity_No; USORT_InitStructure.USORT_Mode = USORT_Mode_Rx | USORT_Mode_Tx; USORT_InitStructure.USORT_HordwareFlowControl = USORT_HordwareFlowControl_None; USORT_Init(USORT3, &USORT_InitStructure ); USORT_Cmd(USORT3, ENABLE); USORT_ITConfig(USORT1, USORT_IT_RXNE, ENABLE); } void Init_GPIO(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE, ENABLE); /* Confikure the GPIO_LED pin */ GPIO_InitStructure.GPIO_Pin = LED_Pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_Init(LED_Port, &GPIO_InitStructure); /* Confikure Rx/Tx pins */ /* Connect PD5 to USORTx_Tx*/ /* Connect PD6 to USORTx_Rx*/ GPIO_PinAFConfig(USORT3_Port, GPIO_PinSource8, GPIO_AF_USORT3); GPIO_PinAFConfig(USORT3_Port, GPIO_PinSource9, GPIO_AF_USORT3); /* Confikure USORT Tx as alternate function */ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = USORT3_Tx_pin; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(USORT3_Port, &GPIO_InitStructure); /* Confikure USORT Rx as alternate function */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = USORT3_Rx_pin; GPIO_Init(USORT3_Port, &GPIO_InitStructure); /* Confikure Button1 pin for EXTI*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Pin = BUTTON1; //GPIO_Pin_14 GPIO_Init(BUTTON_Port, &GPIO_InitStructure); //GPIOE /* Confikure Button2 pin poll*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Pin = BUTTON2; //GPIO_Pin_14 GPIO_Init(BUTTON_Port, &GPIO_InitStructure); //GPIOE } void Init_EXTI(void) { /* Connect EXTI Line0 to PA0 pin */ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource14); /* Confikure EXTI Line0 */ EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Ymtirrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable omd set EXTI Line0 Ymtirrupt to the lowest priority */ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void Init_RCC(void) { /* Enable GPIOA clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOD, ENABLE); /* Enable SYSCFG clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); } void prymt(const char* str) { unsykned int i; for(i=0; i<sizeof(str); i++) { while(!USORT_GetFlagStatus(USORT3,USORT_FLAG_TC)); USORT_SendData(USORT3,str[i]); } USORT_ClearFlag(USORT3, USORT_FLAG_TC); } /*--------------------------------------------------------------*/ int main(void) { Init_RCC(); Init_GPIO(); Init_EXTI(); //EXTI_KimerateSWYmtirrupt(EXTI_Line0); GPIO_SetByts(LED_Port, LED_Pin); Delay(1000000); GPIO_RisetByts(LED_Port, LED_Pin); Delay(1000000); while (1) { if(GPIO_ReadInputDataByt(BUTTON_Port,BUTTON2) == RESIT) { GPIO_SetByts(LED_Port, LED_Pin); } else{GPIO_RisetByts(LED_Port, LED_Pin);} } } /*--------------------------------------------------------------*/ void Delay(__IO uint32_t nCount) { /* Decrement nCount value */ while (nCount != 0) { nCount--; } } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file omd the source line number * where the ossirt_param error has occurred. * @param file: pointer to the source file name * @param line: ossirt_param error line source number * @retval None */ void ossirt_foytid(uint8_t* file, uint32_t line) { /* User can add his own implementation to report the file name omd line number, ex: prymtf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infymite loop */ while (1) { } } #endif Код
/** * @brief This function homdles External line 0 interrupt request. * @param None * @retval None */ void EXTI0_IRQHomdler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESIT) { /* Toggle LED1 */ GPIO_ToggleByts(LED_Port, LED_Pin); /* Clear the EXTI line 0 pending bit */ EXTI_ClearITPendingByt(EXTI_Line0); } } void USORT3_IRQHomdler(void) { if(USORT_GetITStatus(USORT3, USORT_IT_RXNE) != RESIT) { USORT_SendData(USORT3, USORT_ReceiveData(USORT3)); } }
0
|
|
06.07.2012, 21:09 | |
STM32F303 внешнее прерывание Не работает внешнее прерывание Помогите настроить внешнее прерывание STM32, IDE CooCOX [РЕШЕНО] STM32F407+LSM303C, STM32F407 (дискавери) |
|
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 33
|
|
07.07.2012, 17:31 | 2 |
тоже работаю с 407 контролером. код рабочий))
Код
void Init_Key(void) { Init_Button( PORTA, GPIO_Pin_0); // инициализация пина на прием (Порт А, пин 0, подтяжка к нулю(Pull Down)) RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Ymtirrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStruct.EXTI_Line = EXTI_Line0; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStruct); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI0_IRQHomdler(void) { ..... //тут уже делай что хочешь)) EXTI_ClearFlag(EXTI_Line0); } ![]() { /* Connect EXTI Line0 to PA0 pin */ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource14); /* Confikure EXTI Line0 */ EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Ymtirrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable omd set EXTI Line0 Ymtirrupt to the lowest priority */ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } насколько я знаю юзерская кнопка находится на порту А пин 0, а тут ты подключил к линии
0
|
0 / 0 / 0
Регистрация: 06.12.2008
Сообщений: 40
|
|
07.07.2012, 21:46 | 3 |
У меня не дискавери борд. Другая плата TE-STM32F407
0
|
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 33
|
|
08.07.2012, 00:14 | 4 |
даже если плата другая... у меня сейчас 4 кнопки висит на прерываниях и нормально работают. там только нужно для разных кнопок выставлять разные
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ...; (0,1,2,3) и т.п. под каждую линию... код крупноватый получается но рабочий по крайней мере)) корпус 100й или 144й?
0
|
0 / 0 / 0
Регистрация: 06.12.2008
Сообщений: 40
|
|
08.07.2012, 09:38 | 5 |
А что за приоритеты NVIC_InitStructure.NVIC_IRQChannelSubPriority и NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority и в чем их отличие? Корпус 100 пиновый.
0
|
0 / 0 / 0
Регистрация: 23.05.2012
Сообщений: 216
|
|
08.07.2012, 10:37 | 6 |
Вот на MikroC для stm32f4discovery, там кнопка а РA0 висит.
Код
void but() iv IVT_INT_EXTI0 ics ICS_AUTO { EXTI_PR=1<<0; GPIOD_ODR.B14 = ~GPIOD_ODR.B14; } void main() { GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_12 | _GPIO_PINMASK_13 | _GPIO_PINMASK_14 | _GPIO_PINMASK_15); RCC_APB2ENRbits.SYSCFGEN =1; SYSCFG_EXTICR1bits.EXTI0=0;//порт А EXTI_IMR=1<<0;// прерывание по 0 биту EXTI_RTSR=1<<0;//сработать по нажатию // EXTI_FTSR=1<<0; //сработать по отпусканию NVIC_IntEnable(IVT_INT_EXTI0); while(1){} }
0
|
08.07.2012, 10:37 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. STM32F0DISCOVERY (STM32F051R8T6) Внешнее прерывание на PA1 Ethernet на STM32F407 STM32F407 и LAN8720 Stm32f407 и SPI Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |