Прот5

Как заставить линковщик Arduino IDE вшить USART1_IRQHandler

2 posts in this topic

Прот5    1

Всем привет!


Пытаюсь настроить прерывание на чтение USART1 без HAL/SPL напрямую обращаясь к регистрам в среде Arduino IDE и столкнулся с проблемой:
обработчик прерывания не цепляется по всей видимости при линковке, т.е. само прерывание срабатывает при отправке на ком-порт, и сразу начинает мигать индикатор ошибки у Blue pill (stm32f103c)... в остальном все работает нормально, не работает именно RX у МК... причем, если не использовать прерывание на чтение, то RX так же не работает, т.е. если просто выставить биты RE, TE и UE.. то TX работает, а RX нет:

...
void USART1_IRQHandler(void)
{
  if (USART1_BASE->SR & USART_SR_RXNE)
  {

  }
}
void setup(){
...
  RCC_BASE->APB2ENR  |= (RCC_APB2ENR_USART1EN);
  USART1_BASE->BRR = 0x1D4C; //baudrate 9600 @72Mhz
  USART1_BASE->CR2 = (USART1_BASE->CR2&0xFFFF80FF);//обнуляем LINEN STOP[1:0] CLK EN CPOL CPHA LBCL
  USART1_BASE->CR3 = (USART1_BASE->CR3&0xFFFFF804);// обнуляем CTSIE CTSE RTSE DMAT DMAR SCEN NACK HDSEL IREN EIE
  USART1_BASE->CR1 |= USART_CR1_UE | USART_CR1_RE | USART_CR1_TE | USART_CR1_RXNEIE;

  noInterrupts();
  NVIC_BASE->ISER[37/32] = BIT(37%32); // 37 - USART1 из Reference Manual'a
  interrupts();// вызывает внутри __enable_irq(), напрямую почему-то не определено и хрен знает какой хидер цеплять
...
}
...

Кто-нибудь сталкивался с подобным? Как без HAL SPL все это дело напрямую запилить, а точнее, чтобы линковщик обработчик USART1_IRQHandler вшил? Пробовал добавлять extern "C" { void USART1_IRQHandler(void){...} } ... тоже не помогло, причем если поставить после всех хидеров сразу с описанием внутренностей функции, то линковщик ругается "conflicts with new declaration with 'C' linkage".... а если перед setup(), то линкуется без ошибок, но видать выкидывает эту функцию.... не могу заставить его подхватить обработчик.

Share this post


Link to post
Share on other sites
Прот5    1

все, вопрос снят.... если кому интересно - вместо USART1_IRQHandler надо использовать __irq_usart1(void), тогда все ок.

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Совершенно зря вы импульсник расположили между платами усилителя!
    • @Джон1988 балластом грузил?
    • Та не торгуйтесь вы за сотые-десятые доли вольта. На днях сдавал заказчику блок питания при пониженном на 10% сетевом,
      так пока щупы подключишь, вместо 198 В уже 196 или 200.
      И вообще эта формула (1,41*U эфф.) действует только для чисто синусоидального напряжения,
      а гляньте осциллографом сетевое - там и ступеньки, и зазубрины, и вершина уплощенная.
      Надо к расчетным величинам % 10 добавлять, чтобы потом репу  не чесать - а чего ж оно так?
    • Без разницы 5 или 10. Главное конденсатор последовательно катушке. 
    • пока приживается. корпус нужно доделать а так усилитель суперский. Первый раз использовал ибп в усилителе и не капельки не пожалел. Думаю от трансформаторов откажусь в итоге)   
    • Только вот как узнать об этом без подсчета CRC? На глазок?  Вы уверены, что датчик вам всегда вернет значение, которое вы сразу опознаете, как недостоверное? В общем, спорить более не буду - как уже говорил, каждый вправе выстрелить себе в ногу своим способом.
    • Могу: любые твои слова есть демагогия. А я в Крым хочу. В этом году уже точно не выйдет, а в следующем постараюсь. Мост есть, машина есть... осталось время и деньги выкроить А в Сочи - ни ногой! Барыги там безбашенные, по слухам в этом сезоне мороженое на пляже продают от 200 рублей стаканчик/рожок! Еще и туристический сбор ввели.