И вопрос первый - нигде не смог найти подробное описание SysTick (System tick timer). Имеется только адрес вектора прерывания, одна фраза о калибровке и всё. А где регистры?
И такая картина везде - и в китайских версиях мануалов, и в английских. Причём, на любое из семейств - F002, F003, F030.
Нет, понятно, что можно наковырять по кусочкам - что-то из описания Cortex-M0 с developer.arm.com, а конкретные названия регистров из исходников примеров Puya, но почему в документации-то ничего нет?
Может я какой документ или appnote пропустил?
_________________ Платы для HLDI - установки лазерной засветки фоторезиста. ФоторезистыOrdyl Alpha 350 и AM 140. Жидкое олово для лужения плат (видео) - самое лучшее и только у меня. Паяльная маска XV501T-4 и KSM-S6189 (5 цветов). Заказ печатных плат - pcbsmac@gmail.com
Заголовок сообщения: Re: PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Пн сен 22, 2025 23:42:24
Прорезались зубы
Зарегистрирован: Пн сен 15, 2025 08:43:23 Сообщений: 224
Рейтинг сообщения:0
Так это же из документации на ядро ARM! Соответственно, в ней и читать. Я тоже, когда начал с STM32 заниматься, не понимал, какого черта часть регистров вообще в мануале не описана. Нашел их в мануале на ядро.
_________________ Windows must die! And the users of this crap should either become smarter or become janitors.
SysTick - Относится к ядру (Core) и описание соответственно будет в RM на Cortex-M0 (armv6-m) и CMSIS файлы для С/С++ для Core - отдельно идут для любых Cortex-ов
в облаке у меня есть - Arm_Architecture_v6m_Reference_Manual.pdf
Отправляем 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 и AM 140. Жидкое олово для лужения плат (видео) - самое лучшее и только у меня. Паяльная маска XV501T-4 и KSM-S6189 (5 цветов). Заказ печатных плат - pcbsmac@gmail.com
/* 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);
Zikon, не поможет. Я эти примеры видел, и в этих примерах ничего принципиально отличного от моего обработчика не делается.
Единственная разница - добавлено (void)USART1->SR, но это ничего не меняет - при отправке 1 байта, прерывание USART упорно генерируется дважды.
Да и не может (void)USART1->SR на что-то повлиять в моём случае - согласно даташиту это может быть полезным лишь при multiprocessor communication, у меня же вообще тестовый стенд, и прошивка ничего не делает, только отправляет 1 байт.
_________________ Платы для HLDI - установки лазерной засветки фоторезиста. ФоторезистыOrdyl Alpha 350 и AM 140. Жидкое олово для лужения плат (видео) - самое лучшее и только у меня. Паяльная маска XV501T-4 и KSM-S6189 (5 цветов). Заказ печатных плат - pcbsmac@gmail.com
Код кривой. Содержит сразу несколько багов: 1) будет передано больше байт, чем tx_size; 2) будут ложные прерывания; 3) будут "гонки"; 4) будет некорректное состояние битов CR1 после завершения передачи (останется стоять TCIE); ...
Все баги там видны невооружённым глазом. Если хотя-бы одним глазом заглянть в мануал.
Но все советы вы проигнорировали. Баги остались на месте....
TXEIE используется для отправки байтов из буфера. Когда последний байт записан в регистр DR, TXEIE выключается, а TCIE включается -> генерирует прерывание только один раз, когда байт полностью передан. Не пробовал, протестируйте, посмотрите с отладчиком, могут быть неточности.
Отправляем больше 1 байта, прерывание генерируется ровно по числу отправляемых байт.
Количество прерываний в том "коде" зависит от фаз Луны.
После записи в DR, у вас сразу может быть сгенерировано новое прерывание (если регистр сдвига был пуст в момент записи). И тогда никакие маскирования TXEIE не помогут. Либо не будет сразу сгенерировано (если регистр сдвига был не пуст). Также код содержит "гонки", а значит его работа будет зависеть от других событий в системе, происходящих в это время. Достаточно любому более приоритетному прерыванию случиться сразу после записи в DR - он будет или глючить или не глючить.
Запрещать TXEIE нужно ДО записи последнего символа в DR, а не ПОСЛЕ. Вроде как это очевидно.
Когда последний байт записан в регистр DR, TXEIE выключается, а TCIE включается -> генерирует прерывание только один раз, когда байт полностью передан.
Никакой TCIE в том ISR не нужен. Так как нет никаких поводов отслеживать реальное окончание передачи символа. Там нужно только грамотно работать с сигналом опустошения FIFO передатчика. Согласно User Manual. Только и всего.
Есть много решений. Но ТС есть начало и спрашивает, а мы отвечаем. Он сам придет к ответу. Бы использовал DMA без прерывания.
Ещё раз: ТС там не нужен. От слова 'совсем'. Не надо валить с больной головы на здоровую. Прилепливание туда ещё и TC не даст никакого результата, кроме ещё большего запутывания. Там вся работа основана на TXE. Его вполне достаточно.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения