PY32 - микроконтроллеры Puya, вопросы и решения

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3475
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

PY32 - микроконтроллеры Puya, вопросы и решения

Сообщение smacorp »

И вопрос первый - нигде не смог найти подробное описание SysTick (System tick timer). Имеется только адрес вектора прерывания, одна фраза о калибровке и всё. А где регистры?

И такая картина везде - и в китайских версиях мануалов, и в английских. Причём, на любое из семейств - F002, F003, F030.

Нет, понятно, что можно наковырять по кусочкам - что-то из описания Cortex-M0 с developer.arm.com, а конкретные названия регистров из исходников примеров Puya, но почему в документации-то ничего нет?

Может я какой документ или appnote пропустил?
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Аватара пользователя
linux_rulezz
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Re: PY32 - микроконтроллеры Puya, вопросы и решения

Сообщение linux_rulezz »

Так это же из документации на ядро ARM! Соответственно, в ней и читать.
Я тоже, когда начал с STM32 заниматься, не понимал, какого черта часть регистров вообще в мануале не описана. Нашел их в мануале на ядро.
Windows must die!
Аватара пользователя
Zikon
Встал на лапы
Сообщения: 92
Зарегистрирован: Вт фев 28, 2017 08:13:31
Откуда: Свердловская обл.

Re: PY32 - микроконтроллеры Puya, вопросы и решения

Сообщение Zikon »

Да.

SysTick - Относится к ядру (Core) и описание соответственно будет в RM на Cortex-M0 (armv6-m)
и CMSIS файлы для С/С++ для Core - отдельно идут для любых Cortex-ов

в облаке у меня есть - Arm_Architecture_v6m_Reference_Manual.pdf

https://disk.yandex.ru/d/-6DTrL-0xZCn6g/%5B%20ARM%20%5D

для любых других контроллеров также
те-же CH32V - тоже описание ядра в отдельных файлах
на V4 - например QingKeV4_Processor_Manual.PDF
Аватара пользователя
JackSmith
Потрогал лапой паяльник
Сообщения: 332
Зарегистрирован: Ср мар 09, 2016 08:07:41

Re: PY32 - микроконтроллеры Puya, вопросы и решения

Сообщение JackSmith »

"Cortex-M0+ Technical Reference Manual" (TRM) еще
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3475
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: PY32 - микроконтроллеры Puya, вопросы и решения

Сообщение smacorp »

PY32 -> USART.

Отправляем 1 байт, прерывание генерируется 2 раза.
Отправляем больше 1 байта, прерывание генерируется ровно по числу отправляемых байт.

Кто-нибудь замечал такое?

Обработчик прерывания простой:

Код: Выделить всё

void USART1_IRQHandler()
{
    uint32_t sr = USART1->SR;
    if (sr & USART_SR_TXE)                      // Transmit data register empty
    {                                        
        USART1->DR = *tx_buffer++;              // Send data
        tx_size--;
        if (tx_size == 0)
        {
            USART1->CR1 &= ~USART_CR1_TXEIE;    // Disable TXE interrupt
        }
    }
}
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Аватара пользователя
Zikon
Встал на лапы
Сообщения: 92
Зарегистрирован: Вт фев 28, 2017 08:13:31
Откуда: Свердловская обл.

Re: PY32 - микроконтроллеры Puya, вопросы и решения

Сообщение Zikon »

может поможет вырезка из примеров

Код: Выделить всё

  /*  Transmit data register empty  */ 
  if ((LL_USART_IsActiveFlag_TXE(USARTx) != RESET) && (LL_USART_IsEnabledIT_TXE(USARTx) != RESET))
  {
    /* To prevent the TC flag bit from being affected by other operations during
       data transmission, read the SR register in conjunction with write the DR 
       Register to clear the TC flag bit.
    */
    (void)(USARTx->SR);
    LL_USART_TransmitData8(USARTx, *TxBuff);
    TxBuff++;
    if (--TxCount == 0U)
    { 
        LL_USART_DisableIT_TXE(USARTx);
        
        LL_USART_EnableIT_TC(USARTx);
    }
    return;
  }
  
  /*  Transmission complete  */
  if ((LL_USART_IsActiveFlag_TC(USARTx) != RESET) && (LL_USART_IsEnabledIT_TC(USARTx) != RESET))
  {
    LL_USART_DisableIT_TC(USARTx);
    UartReady = SET;
  
    return;
  }
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3475
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: PY32 - микроконтроллеры Puya, вопросы и решения

Сообщение smacorp »

Zikon, не поможет. Я эти примеры видел, и в этих примерах ничего принципиально отличного от моего обработчика не делается.

Единственная разница - добавлено (void)USART1->SR, но это ничего не меняет - при отправке 1 байта, прерывание USART упорно генерируется дважды.

Да и не может (void)USART1->SR на что-то повлиять в моём случае - согласно даташиту это может быть полезным лишь при multiprocessor communication, у меня же вообще тестовый стенд, и прошивка ничего не делает, только отправляет 1 байт.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: PY32 - микроконтроллеры Puya, вопросы и решения

Сообщение jcxz »

[uquote="smacorp",url="/forum/viewtopic.php?p=4759198#p4759198"]Единственная разница - добавлено (void)USART1->SR, но это ничего не меняет - при отправке 1 байта, прерывание USART упорно генерируется дважды.[/uquote]Странно - когда в другой теме про этот ваш код я написал что он кривой и содержит массу багов, вы ответили:
[uquote="smacorp",url="/forum/viewtopic.php?p=4758831#p4758831"]Тем не менее, код нормально работает. Было бы странным, если бы в официальный SDK вкладывали неработающие примеры.[/uquote]
Хотя я писал как раз про эти проблемы, о которых вы сейчас рассказываете:
[uquote="jcxz",url="/forum/viewtopic.php?p=4758652#p4758652"]Код кривой. Содержит сразу несколько багов: 1) будет передано больше байт, чем tx_size; 2) будут ложные прерывания; 3) будут "гонки"; 4) будет некорректное состояние битов CR1 после завершения передачи (останется стоять TCIE); ...[/uquote]Все баги там видны невооружённым глазом. Если хотя-бы одним глазом заглянть в мануал.

Но все советы вы проигнорировали. Баги остались на месте.... :dont_know:
veso74
Поставщик валерьянки для Кота
Сообщения: 1906
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: PY32 - микроконтроллеры Puya, вопросы и решения

Сообщение veso74 »

Код: Выделить всё

void USART1_IRQHandler()
{
  uint32_t sr = USART1->SR;
  if (sr & USART_SR_TXE)
  {
    if (tx_size > 0)
    {
      USART1->DR = *tx_buffer++;
      tx_size--;
      if (tx_size == 0)
      {
        USART1->CR1 &= ~USART_CR1_TXEIE;
        USART1->CR1 |= USART_CR1_TCIE;
      }
    }
  }

  if (sr & USART_SR_TC)
  {
    USART1->SR &= ~USART_SR_TC;
    USART1->CR1 &= ~USART_CR1_TCIE;
  }
}
TXEIE используется для отправки байтов из буфера. Когда последний байт записан в регистр DR, TXEIE выключается, а TCIE включается -> генерирует прерывание только один раз, когда байт полностью передан. Не пробовал, протестируйте, посмотрите с отладчиком, могут быть неточности.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: PY32 - микроконтроллеры Puya, вопросы и решения

Сообщение jcxz »

[uquote="smacorp",url="/forum/viewtopic.php?p=4759129#p4759129"]Отправляем больше 1 байта, прерывание генерируется ровно по числу отправляемых байт.[/uquote]Количество прерываний в том "коде" зависит от фаз Луны.

После записи в DR, у вас сразу может быть сгенерировано новое прерывание (если регистр сдвига был пуст в момент записи). И тогда никакие маскирования TXEIE не помогут. Либо не будет сразу сгенерировано (если регистр сдвига был не пуст). Также код содержит "гонки", а значит его работа будет зависеть от других событий в системе, происходящих в это время. Достаточно любому более приоритетному прерыванию случиться сразу после записи в DR - он будет или глючить или не глючить.

Запрещать TXEIE нужно ДО записи последнего символа в DR, а не ПОСЛЕ. Вроде как это очевидно.

Добавлено after 8 minutes 3 seconds:
[uquote="veso74",url="/forum/viewtopic.php?p=4759220#p4759220"]Когда последний байт записан в регистр DR, TXEIE выключается, а TCIE включается -> генерирует прерывание только один раз, когда байт полностью передан.[/uquote]Никакой TCIE в том ISR не нужен. Так как нет никаких поводов отслеживать реальное окончание передачи символа. Там нужно только грамотно работать с сигналом опустошения FIFO передатчика. Согласно User Manual. Только и всего.
veso74
Поставщик валерьянки для Кота
Сообщения: 1906
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: PY32 - микроконтроллеры Puya, вопросы и решения

Сообщение veso74 »

Есть много решений. Но ТС есть начало и спрашивает, а мы отвечаем. Он сам придет к ответу. Бы использовал DMA без прерывания.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: PY32 - микроконтроллеры Puya, вопросы и решения

Сообщение jcxz »

[uquote="veso74",url="/forum/viewtopic.php?p=4759223#p4759223"]Есть много решений. Но ТС есть начало и спрашивает, а мы отвечаем. Он сам придет к ответу. Бы использовал DMA без прерывания.[/uquote]Ещё раз: ТС там не нужен. От слова 'совсем'. Не надо валить с больной головы на здоровую. Прилепливание туда ещё и TC не даст никакого результата, кроме ещё большего запутывания.
Там вся работа основана на TXE. Его вполне достаточно.
Ответить

Вернуться в «ARM»