Panowie czy może ktoś sprawdzić czy dobrze skonfigurowałem pin pracujący jako RX w UART5;
Pytam ponieważ nie mogę uruchomić przerwania odbiorczego.
Kod: Zaznacz cały
#include "stm32f4xx.h"
uint32_t I;
void UART5_GPIO_INIT(void);
int main(void)
{
RCC->APB1ENR = RCC_APB1ENR_UART5EN;
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOGEN;
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOCEN;
__DSB();
GPIOG->MODER = GPIO_MODER_MODER13_0 | GPIO_MODER_MODER14_0;
UART5_GPIO_INIT();
UART5->BRR = SystemCoreClock/9600;
UART5->CR1 = USART_CR1_UE | USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE;
NVIC_EnableIRQ(UART5_IRQn);
SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk;
//__WFI();
while(1)
{
for(I = 0; I < 1000000; I++)
{
}
GPIOG->ODR ^= GPIO_ODR_ODR_13;
}
return 0;
}
__attribute__((interrupt)) void UART5_IRQHandler(void)
{
if (UART5->SR & USART_SR_RXNE)
{
UART5->SR &= ~USART_SR_RXNE;
uint16_t tmp;
tmp = UART5->DR;
UART5->DR = tmp+1;
}
GPIOG->ODR ^= GPIO_ODR_ODR_14;
}
void UART5_GPIO_INIT(void)
{
// Config for RX PD2
GPIOD -> MODER |= GPIO_MODER_MODER2_1;
GPIOD -> OTYPER |= 0x00000004;
GPIOD -> PUPDR |= 0x00000020;
GPIOD -> AFR[0] |= 0x00000800;
}
Mały update program działa ale nie do końca poprawnie. Po uruchomieniu programu dioda Miga: GPIOG->ODR ^= GPIO_ODR_ODR_13;
Po kliknięciu niektórych klawiszy przerwanie jest wywoływane na przykład spacji ale muszą ją kliknąć czasami jeden raz czasami dwa. Prze wejściu w procedurę przerwania dioda przestaję migać do ponownego resetu procesora.