Страница 1 из 1
PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Пн сен 22, 2025 21:54:46
smacorp
И вопрос первый - нигде не смог найти подробное описание SysTick (System tick timer). Имеется только адрес вектора прерывания, одна фраза о калибровке и всё. А где регистры?
И такая картина везде - и в китайских версиях мануалов, и в английских. Причём, на любое из семейств - F002, F003, F030.
Нет, понятно, что можно наковырять по кусочкам - что-то из описания Cortex-M0 с developer.arm.com, а конкретные названия регистров из исходников примеров Puya, но почему в документации-то ничего нет?
Может я какой документ или appnote пропустил?
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Пн сен 22, 2025 23:42:24
linux_rulezz
Так это же из документации на ядро ARM! Соответственно, в ней и читать.
Я тоже, когда начал с STM32 заниматься, не понимал, какого черта часть регистров вообще в мануале не описана. Нашел их в мануале на ядро.
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Вт сен 23, 2025 12:40:41
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
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Вт сен 23, 2025 12:54:11
JackSmith
"Cortex-M0+ Technical Reference Manual" (TRM) еще
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Чт окт 30, 2025 04:19:26
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
}
}
}
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Чт окт 30, 2025 10:47:30
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;
}
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Чт окт 30, 2025 12:22:16
smacorp
Zikon, не поможет. Я эти примеры видел, и в этих примерах ничего принципиально отличного от моего обработчика не делается.
Единственная разница - добавлено (void)USART1->SR, но это ничего не меняет - при отправке 1 байта, прерывание USART упорно генерируется дважды.
Да и не может (void)USART1->SR на что-то повлиять в моём случае - согласно даташиту это может быть полезным лишь при multiprocessor communication, у меня же вообще тестовый стенд, и прошивка ничего не делает, только отправляет 1 байт.
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Чт окт 30, 2025 13:48:37
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]Все баги там видны невооружённым глазом. Если хотя-бы одним глазом заглянть в мануал.
Но все советы вы проигнорировали. Баги остались на месте....

Re: PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Чт окт 30, 2025 13:53:59
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 включается -> генерирует прерывание только один раз, когда байт полностью передан. Не пробовал, протестируйте, посмотрите с отладчиком, могут быть неточности.
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Чт окт 30, 2025 14:03:06
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. Только и всего.
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Чт окт 30, 2025 14:10:20
veso74
Есть много решений. Но ТС есть начало и спрашивает, а мы отвечаем. Он сам придет к ответу. Бы использовал DMA без прерывания.
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Добавлено: Чт окт 30, 2025 14:15:07
jcxz
[uquote="veso74",url="/forum/viewtopic.php?p=4759223#p4759223"]Есть много решений. Но ТС есть начало и спрашивает, а мы отвечаем. Он сам придет к ответу. Бы использовал DMA без прерывания.[/uquote]Ещё раз: ТС там не нужен. От слова 'совсем'. Не надо валить с больной головы на здоровую. Прилепливание туда ещё и TC не даст никакого результата, кроме ещё большего запутывания.
Там вся работа основана на TXE. Его вполне достаточно.