Лёд тронулся.Правда на stm32f103.
Добавлено after 7 minutes 9 seconds:
У меня единственное.Не получается строку отправить.Проблема была в прерывании системного таймера.А вторая проблемаMODIFY_REG(USART1->CR1,
USART_CR1_M | USART_CR1_PCE | USART_CR1_PS ,USART_CR1_TE |USART_CR1_RE); в этой строке а вернее с запятой.Если её убрать
MODIFY_REG(USART1->CR1,
USART_CR1_M | USART_CR1_PCE | USART_CR1_PS |USART_CR1_TE |USART_CR1_RE);-так не работает.А как же мне строку отправить?
stm32f4 cmsis usart +terminal1,9 b
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32f4 cmsis usart +terminal1,9 b
- Вложения
-
- main.c
- (17.72 КБ) 167 скачиваний
- Реклама
Re: stm32f4 cmsis usart +terminal1,9 b
Professor Chaos писал(а):Извиняюсь, ошибся. У вас так:
Reg = (0<<Pos1)|(0<<Pos2);
Надо лишь помнить, что такой записью вы портите содержимое всех прочих битовых полей регистра Reg, что тоже нежелательно.
Ты про это?"Шарик! Ты- балбес! (с) Кот Матроскин"
Я их не просто порчу, а устанавливаю в нужные мне значения!Код: Выделить всё
ComPort UART_base::open ( ComPort _port, uint32 _baudRate, uint8 _dataBits, Parity _parity, StopBits _stopBits ) { // Сбросим все конфигурационные биты. По ходу разбора параметров будем // выставлять нужные. usart -> CR1 = \ usart -> CR2 = \ usart -> CR3 = 0; ....... usart -> SR = 0; setEvents(); // Разрешаем нужные нам прерывания. ....... return( port ); } /////////////////////////////////////// void ConIO::setEvents( void ) { // Сначала сбросим биты событий. //usart -> ISR = 0; usart -> CR1 = ( // Запрос прерывания в следующих случаях: 0 << USART_CR1_TCIE_Pos | // - по установке бита TC регистра SR, // т.е. при окончании передачи; 0 << USART_CR1_TXEIE_Pos | // - по установке бита TXE регистра SR, // т.е. при начале передачи; 0 << USART_CR1_RXNEIE_Pos | // - что-то пришло в УАРТ. // Не забываем включить сам модуль и выводы: 1 << USART_CR1_TE_Pos | // - включаем передатчик; 1 << USART_CR1_RE_Pos | // - включаем приёмник; 1 << USART_CR1_UE_Pos // - включение USART. ); // Разрешаем приём, передачу, устанавливаем обработчики прерываний, // включаем тактирование. installInterruptHandler( usart_IRQn ); }
Зачем словами? Я говорю в данном случае на языке программирования. И говорю я, что не забыл про эти биты, более того, мне нужно, чтобы в этой точке программы они были равны нулю.Reg |= (0<<Pos1)|(0<<Pos2);
Для чего вы это пишите? Проговорите словами, что вы хотите сделать такой строкой.
Re: stm32f4 cmsis usart +terminal1,9 b
Ну вот, F4 не тянет, а F103 потянул.ivan dimir писал(а):Лёд тронулся.Правда на stm32f103.
Способов много, от printf до всяких там xprintf.ivan dimir писал(а):А как же мне строку отправить?
Как вариант, самодельный
Спойлер
Код: Выделить всё
void tx_uart(char data)
{
while (!(USART1->SR & USART_SR_TC)); //
USART1->DR=data;
}
void putstring ( char *str)
{ unsigned char i;
for(i=0;str[i]!='\0';i++)
tx_uart(str[i]);
}
putstring ("Hello World!");Re: stm32f4 cmsis usart +terminal1,9 b
операцией ИЛИ "0" 1-цу не погасит, но при просто присвоении "1" и нет. Получается запись просто на память
Парамеиры в функцию передаются через запятую. Сколько параметров нужно MODIFY_REG(.......) ? как можно убрать запятую? проверяйте что вы хотите от регистра
Парамеиры в функцию передаются через запятую. Сколько параметров нужно MODIFY_REG(.......) ? как можно убрать запятую? проверяйте что вы хотите от регистра
Re: stm32f4 cmsis usart +terminal1,9 b
[uquote="tonyk",url="/forum/viewtopic.php?p=4066709#p4066709"]Я выложил примеры настройки и тактирования, и УАРТ.
usart->SR &= ~USART_SR_TXE;[/uquote]
Так делать нельзя! Читайте описание регистра SR.
Правильная запись для сброса бита TXE: usart->SR = ~USART_SR_TXE;
Ваша запись, кроме того что не неоптимальна, так ещё и может сбрасывать другие случайные флаги.
Да и вообще смысл этого участка неясен... Видимо записали символ в буфер передачи теперь хотите чтобы вызвалось прерывание передачи (TXEIE)?
Но зачем-то перед его его разрешением пытаетесь сбрасывать флаг TXE.
Т.е. - если буфер передатчика был уже пуст к этому моменту, то флаг TXE стоял. Вы его принудительно сбросили и только потом разрешили прерывание TXEIE. Ну так оно никогда и не сработает, так как TXE принудительно сброшен.
Вообще флаги в регистре SR редко когда нужно принудительно сбрасывать. Они сбрасываются сами при определённых событиях (TXE - при записи символа в регистр передатчика).
usart->SR &= ~USART_SR_TXE;[/uquote]
Так делать нельзя! Читайте описание регистра SR.
Правильная запись для сброса бита TXE: usart->SR = ~USART_SR_TXE;
Ваша запись, кроме того что не неоптимальна, так ещё и может сбрасывать другие случайные флаги.
Да и вообще смысл этого участка неясен... Видимо записали символ в буфер передачи теперь хотите чтобы вызвалось прерывание передачи (TXEIE)?
Но зачем-то перед его его разрешением пытаетесь сбрасывать флаг TXE.
Т.е. - если буфер передатчика был уже пуст к этому моменту, то флаг TXE стоял. Вы его принудительно сбросили и только потом разрешили прерывание TXEIE. Ну так оно никогда и не сработает, так как TXE принудительно сброшен.
Вообще флаги в регистре SR редко когда нужно принудительно сбрасывать. Они сбрасываются сами при определённых событиях (TXE - при записи символа в регистр передатчика).
Последний раз редактировалось jcxz Чт июл 29, 2021 18:06:04, всего редактировалось 2 раза.
- Реклама
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32f4 cmsis usart +terminal1,9 b
jcxz, ну что за бред? Бит TXE - read only! Сбрасывается он, если в DR что-то будет записано...
Re: stm32f4 cmsis usart +terminal1,9 b
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4067694#p4067694"]jcxz, ну что за бред? Бит TXE - read only! Сбрасывается он, если в DR что-то будет записано...[/uquote]Бред был в исходном коде (сброс TXE) в посте, на который я отвечал.
Если TXE - read only, то та строка вообще бессмысленна.
Если TXE - read only, то та строка вообще бессмысленна.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32f4 cmsis usart +terminal1,9 b
Да там вообще много чего бессмысленного. И читать такой код страшно.


