PY32 - микроконтроллеры Puya, вопросы и решения
PY32 - микроконтроллеры Puya, вопросы и решения
И вопрос первый - нигде не смог найти подробное описание SysTick (System tick timer). Имеется только адрес вектора прерывания, одна фраза о калибровке и всё. А где регистры?
И такая картина везде - и в китайских версиях мануалов, и в английских. Причём, на любое из семейств - F002, F003, F030.
Нет, понятно, что можно наковырять по кусочкам - что-то из описания Cortex-M0 с developer.arm.com, а конкретные названия регистров из исходников примеров Puya, но почему в документации-то ничего нет?
Может я какой документ или appnote пропустил?
И такая картина везде - и в китайских версиях мануалов, и в английских. Причём, на любое из семейств - F002, F003, F030.
Нет, понятно, что можно наковырять по кусочкам - что-то из описания Cortex-M0 с developer.arm.com, а конкретные названия регистров из исходников примеров Puya, но почему в документации-то ничего нет?
Может я какой документ или appnote пропустил?
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
- linux_rulezz
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Пн сен 15, 2025 08:43:23
- Откуда: Маленький СССР посреди шариатской республики
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Так это же из документации на ядро ARM! Соответственно, в ней и читать.
Я тоже, когда начал с STM32 заниматься, не понимал, какого черта часть регистров вообще в мануале не описана. Нашел их в мануале на ядро.
Я тоже, когда начал с STM32 заниматься, не понимал, какого черта часть регистров вообще в мануале не описана. Нашел их в мануале на ядро.
Windows must die!
- Zikon
- Встал на лапы
- Сообщения: 92
- Зарегистрирован: Вт фев 28, 2017 08:13:31
- Откуда: Свердловская обл.
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Да.
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
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, вопросы и решения
"Cortex-M0+ Technical Reference Manual" (TRM) еще
Re: PY32 - микроконтроллеры Puya, вопросы и решения
PY32 -> USART.
Отправляем 1 байт, прерывание генерируется 2 раза.
Отправляем больше 1 байта, прерывание генерируется ровно по числу отправляемых байт.
Кто-нибудь замечал такое?
Обработчик прерывания простой:
Отправляем 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
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
- Zikon
- Встал на лапы
- Сообщения: 92
- Зарегистрирован: Вт фев 28, 2017 08:13:31
- Откуда: Свердловская обл.
Re: PY32 - микроконтроллеры Puya, вопросы и решения
может поможет вырезка из примеров
Код: Выделить всё
/* 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, вопросы и решения
Zikon, не поможет. Я эти примеры видел, и в этих примерах ничего принципиально отличного от моего обработчика не делается.
Единственная разница - добавлено (void)USART1->SR, но это ничего не меняет - при отправке 1 байта, прерывание USART упорно генерируется дважды.
Да и не может (void)USART1->SR на что-то повлиять в моём случае - согласно даташиту это может быть полезным лишь при multiprocessor communication, у меня же вообще тестовый стенд, и прошивка ничего не делает, только отправляет 1 байт.
Единственная разница - добавлено (void)USART1->SR, но это ничего не меняет - при отправке 1 байта, прерывание USART упорно генерируется дважды.
Да и не может (void)USART1->SR на что-то повлиять в моём случае - согласно даташиту это может быть полезным лишь при multiprocessor communication, у меня же вообще тестовый стенд, и прошивка ничего не делает, только отправляет 1 байт.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Re: PY32 - микроконтроллеры Puya, вопросы и решения
[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]Все баги там видны невооружённым глазом. Если хотя-бы одним глазом заглянть в мануал.
Но все советы вы проигнорировали. Баги остались на месте....
[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]Все баги там видны невооружённым глазом. Если хотя-бы одним глазом заглянть в мануал.
Но все советы вы проигнорировали. Баги остались на месте....
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1906
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: PY32 - микроконтроллеры Puya, вопросы и решения
Код: Выделить всё
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;
}
}Re: PY32 - микроконтроллеры Puya, вопросы и решения
[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. Только и всего.
После записи в 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, вопросы и решения
Есть много решений. Но ТС есть начало и спрашивает, а мы отвечаем. Он сам придет к ответу. Бы использовал DMA без прерывания.
Re: PY32 - микроконтроллеры Puya, вопросы и решения
[uquote="veso74",url="/forum/viewtopic.php?p=4759223#p4759223"]Есть много решений. Но ТС есть начало и спрашивает, а мы отвечаем. Он сам придет к ответу. Бы использовал DMA без прерывания.[/uquote]Ещё раз: ТС там не нужен. От слова 'совсем'. Не надо валить с больной головы на здоровую. Прилепливание туда ещё и TC не даст никакого результата, кроме ещё большего запутывания.
Там вся работа основана на TXE. Его вполне достаточно.
Там вся работа основана на TXE. Его вполне достаточно.