isx писал(а):Может с настройками что не так?
вроде SYSCFG->EXTICR[0] вместо SYSCFG->EXTICR[1]
isx писал(а):Может с настройками что не так?
uldemir писал(а):Однако вопрос остаётся. Нужен ли CMSIS или нет. И на что влияет галочка в Library Configurations -> CMSIS ?
Достаточно ли iostm32f051 для несложной фирмвари на тему поморгать светодиодом по прерываниям?
oleg110592 писал(а):вроде SYSCFG->EXTICR[0] вместо SYSCFG->EXTICR[1]
Код: Выделить всё
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN ;
GPIOA->MODER &=~ GPIO_MODER_MODER2;
GPIOA->PUPDR&= ~ GPIO_PUPDR_PUPDR2;
GPIOA->PUPDR|=GPIO_PUPDR_PUPDR2_0;
EXTI->IMR |= EXTI_IMR_MR2;
EXTI->FTSR |=EXTI_FTSR_TR2;
NVIC_SetPriority(EXTI2_IRQn ,15);
NVIC_EnableIRQ(EXTI2_IRQn );Код: Выделить всё
void EXTI2_IRQHandler (void)
{
бла,бла,бла ...
EXTI->PR |=EXTI_PR_PR2;
}Код: Выделить всё
GPIOA->MODER |= GPIO_MODER_MODER14_1 | GPIO_MODER_MODER13_1 | GPIO_MODER_MODER6_1 | GPIO_MODER_MODER2_0;Код: Выделить всё
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR1_0 | GPIO_PUPDR_PUPDR2_0;Код: Выделить всё
uint8_t Clock=0;
RCC_ClocksTypeDef RCC_Clock;
RCC_DeInit();
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_6);
RCC_PLLCmd(ENABLE);
RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);
Clock = RCC_GetSYSCLKSource ();
RCC_GetClocksFreq(&RCC_Clock);Код: Выделить всё
unsigned long ulstm32f10x_it_SysTime = 0;
void SysTick_Handler(void)
{
ulstm32f10x_it_SysTime++;
}Код: Выделить всё
void main(void)
{
uint8_t Clock=0;
RCC_ClocksTypeDef RCC_Clock;
RCC_DeInit();
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_6);
RCC_PLLCmd(ENABLE);
RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);
Clock = RCC_GetSYSCLKSource ();
RCC_GetClocksFreq(&RCC_Clock);
SysTick_Config (SystemCoreClock/1000000); // SystemCoreClock==24000000
uint8_t test;
while(1)
{
vOWWriteBit (0x93);
}
}
Код: Выделить всё
SysTick_Handler
<Exception frame>
vOWWriteBit
main
[_call_main + 0x9]
GARMIN писал(а):В прерывании таймера нужно ручками снять флаг, вызвавший прерывание.
Флагов много, прерываний мало, вот и приходится определять, по какому флагу произошло прерывание.
Chip115 писал(а):Всем привет!
Проблема в том, что МК постоянно находится в SysTick_Handler.
uk8amk писал(а):Chip115 писал(а):Всем привет!
Проблема в том, что МК постоянно находится в SysTick_Handler.
1мкс на 24МГц - это 24 такта. Сколько тактов занимает вход в прерывание+его тело+выход?
А там дальше систик переполняется и снова делает запрос.
Код: Выделить всё
void EXTI0_IRQHandler(void)
{
switch (GPIOA->IDR & GPIO_IDR_1) {
case 0:
TIM16->CCR1 = 0x0000; break;
case 1:
TIM16->CCR1 = 0xFFFF; break;
default:
;}
EXTI->PR |= EXTI_PR_PR0;
}
void EXTI2_IRQHandler(void)
{
TIM16->CCR1 = 500;
EXTI->PR |= EXTI_PR_PR2;
}
int main()
{
NVIC_EnableIRQ(TIM14_IRQn);
NVIC_EnableIRQ(EXTI0_1_IRQn);
NVIC_EnableIRQ(EXTI2_3_IRQn);
NVIC_SetPriority(TIM14_IRQn, 3);
NVIC_SetPriority(EXTI0_1_IRQn, 2);
NVIC_SetPriority(EXTI2_3_IRQn, 1);
RCC->AHBENR |= RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOAEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
RCC->APB1ENR |= RCC_APB1ENR_TIM14EN;
RCC->APB2ENR |= RCC_APB2ENR_TIM16EN;
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGCOMPEN;
GPIOA->MODER |= GPIO_MODER_MODER14_1 | GPIO_MODER_MODER13_1 | GPIO_MODER_MODER6_1;
GPIOA->MODER &=~ GPIO_MODER_MODER2;
GPIOB->MODER |= GPIO_MODER_MODER6_1;
GPIOA->AFR[0] |= 0x05000000;
GPIOB->AFR[0] |= 0x02000000;
GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR0 | GPIO_OSPEEDR_OSPEEDR1 | GPIO_OSPEEDR_OSPEEDR2 | GPIO_OSPEEDR_OSPEEDR3 | GPIO_OSPEEDR_OSPEEDR6;
GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR0 | GPIO_OSPEEDR_OSPEEDR1 | GPIO_OSPEEDR_OSPEEDR6;
GPIOA->PUPDR = 0x5555C555;
SYSCFG->EXTICR[1] |= SYSCFG_EXTICR1_EXTI0_PA | SYSCFG_EXTICR1_EXTI2_PA;
EXTI->RTSR |= EXTI_RTSR_TR2;
EXTI->FTSR |= EXTI_FTSR_TR0 | EXTI_FTSR_TR2;
EXTI->IMR |= EXTI_IMR_MR0 | EXTI_IMR_MR2;
EXTI->PR |= EXTI_PR_PR0;
EXTI->PR |= EXTI_PR_PR2; oleg110592 писал(а):PA2 сконфигурирован на вывод, а от него ожидаются прерывания
dosikus писал(а):Здесь на PA2 но на F4 . SYSCFG и EXTI line не тревожу ибо PA по дефолту

Код: Выделить всё
//Set up EXTI
EXTI->FTSR |= EXTI_FTSR_TR0; //INR
EXTI->RTSR |= EXTI_RTSR_TR13; //HK
EXTI->RTSR |= EXTI_RTSR_TR17; //RTC
EXTI->IMR = (EXTI_IMR_MR0 | EXTI_IMR_MR13 | EXTI_IMR_MR17);
//EXTI to port connection
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
SYSCFG->EXTICR[0] = SYSCFG_EXTICR1_EXTI0_PA;
SYSCFG->EXTICR[3] = SYSCFG_EXTICR4_EXTI13_PC;
RCC->APB2ENR &= ~RCC_APB2ENR_SYSCFGEN;
NVIC_EnableIRQ(EXTI0_1_IRQn);
NVIC_SetPriority(EXTI0_1_IRQn, 0);
NVIC_EnableIRQ(EXTI4_15_IRQn);
NVIC_SetPriority(EXTI4_15_IRQn, 0);
NVIC_SetPriority(RTC_IRQn, 0);
NVIC_EnableIRQ(RTC_IRQn);oleg110592 писал(а):Вот на всякий мой код - из сна по прерываниям на ногах и по часам все нормально выходит.
dosikus писал(а):подождешь до вторника? Железа под рукой нет ...
uk8amk писал(а):Что проверить?
То что только на вход и выход из обработчика тратится по 12 циклов?
Такие мелкие задержки лучше реализовать не через прерывания, а опросом статусного флага таймера в цикле. Если конечно в прерывании не висит конечный автомат. И в этом случае оно будет длинее чем 1 мкс.
isx писал(а):Вот сделал отдельный проект без иной периферии. Проверьте кто может...
Код: Выделить всё
#include "stm32f0xx.h"
volatile int8_t step = 0;
int main()
{
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN;
GPIOB->MODER = GPIO_MODER_MODER14_0; //output
GPIOA->PUPDR |= ( GPIO_PUPDR_PUPDR0_0 | GPIO_PUPDR_PUPDR2_0 ); // pull-up
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGCOMPEN;
SYSCFG->EXTICR[0] = SYSCFG_EXTICR1_EXTI0_PA | SYSCFG_EXTICR1_EXTI2_PA;
RCC->APB2ENR &= ~RCC_APB2ENR_SYSCFGCOMPEN;
//EXTI->RTSR |= EXTI_RTSR_TR2;
EXTI->FTSR |= (EXTI_FTSR_TR0 | EXTI_FTSR_TR2);
EXTI->IMR = (EXTI_IMR_MR0 | EXTI_IMR_MR2);
NVIC_EnableIRQ(EXTI0_1_IRQn);
NVIC_EnableIRQ(EXTI2_3_IRQn);
NVIC_SetPriority(EXTI0_1_IRQn, 0);
NVIC_SetPriority(EXTI2_3_IRQn, 0);
while(1){
if((step & (uint8_t)0x01) != 0) GPIOB->ODR |= GPIO_ODR_14;
else GPIOB->ODR &= ~GPIO_ODR_14;
}
}
void EXTI0_1_IRQHandler(void)
{
if ((EXTI->PR & EXTI_PR_PR0) != 0) /* Check line 0 has triggered the IT */
{
step++;
EXTI->PR |= EXTI_PR_PR0;
}
}
void EXTI2_3_IRQHandler(void)
{
if ((EXTI->PR & EXTI_PR_PR2) != 0) /* Check line 2 has triggered the IT */
{
step--;
EXTI->PR |= EXTI_PR_PR2;
}
}Код: Выделить всё
GPIOB_MODER_bit.MODER8 = 2; // Alternate function PB8 <- AF2 (TIM16_CH1)
GPIOA_MODER_bit.MODER6 = 2; // Alternate function PA6 <- AF5 (TIM16_CH1)
GPIOB_AFRH_bit.AFRH0 = 2; // AF2
GPIOA_AFRL_bit.AFRL6 = 5; // AF5
TIM16_CR1_bit.CEN = 0; // disable timer
TIM16_CCER_bit.CC1E = 0 ; // CCP output disable
TIM16_PSC = 610; // for DEBUG *******************************
TIM16_ARR = 13107; // 8MHz / 13108 = 610Hz / 5 = 122 Hz
TIM16_CCR1 = 5000;
TIM16_CR1_bit.URS = 1; // only overfow generate UEV
TIM16_CR2_bit.CCPC = 1; // Capture/compare preload enable
TIM16_DIER_bit.UIE = 0; // Update interrupt 1 for enable.
TIM16_OCMR1_bit.OC1S = 0; // 00: CC1 channel is configured as output
TIM16_OCMR1_bit.OC1M = 7; // PWM mode 2 inactive until TIMx_CNT<TIMx_CCR1 else active
TIM16_OCMR1_bit.OC1FE = 0; // fast disable
TIM16_OCMR1_bit.OC1PE = 1; // Preload enable
TIM16_CCER_bit.CC1P = 0 ; // Polarity active high
TIM16_BDTR_bit.MOE = 1 ; // OC and OCN outputs are enabled if their respective enable bits are set
TIM16_CCER_bit.CC1E = 1 ; // CCP output enable
TIM16_CR1_bit.CEN = 1; //enable timer
oleg110592 писал(а):так проверил на железке F051C - работает:
Код: Выделить всё
void EXTI0_IRQHandler(void)
.....
void EXTI2_IRQHandler(void)
Код: Выделить всё
void EXTI0_1_IRQHandler(void)
....
void EXTI2_3_IRQHandler(void)