| Форум РадиоКот https://radiokot.ru/forum/ |
|
| st32f303cct6 USART настройка GPIO https://radiokot.ru/forum/viewtopic.php?f=59&t=192086 |
Страница 1 из 2 |
| Автор: | kote52 [ Сб фев 03, 2024 10:02:35 ] |
| Заголовок сообщения: | st32f303cct6 USART настройка GPIO |
Всем привет! Второй день бьюсь с настройкой портов для USART1. Код инициализации: Код: //Выше по коду включен тактирование порта А void ADC1_Init(void) { SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOAEN); //Настроили тактирование PORT A //свой код } void USART1_Init(void) { // USART1: Rx - PA10 , Tx - PA9 // PA9 (TxD) MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER9_Msk, 0b10 << GPIO_MODER_MODER9_Pos); // (10) режим альтернативной функции CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_9); //(0) двухтактный выход или push-pull сокращено PP MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR9_Msk, 0b01 << GPIO_PUPDR_PUPDR9_Pos); // (01) подтяжка к плюсу питания или pull-up сокращено PU MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR9_Msk, 0b11 << GPIO_OSPEEDER_OSPEEDR9_Pos); //(11) 50 MHz, высокочастотный выход MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFRH1_Msk, 0b0111 << GPIO_AFRH_AFRH1_Pos); // 7 << (1 * 4) // PA10 (RxD) MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER10_Msk, 0b10 << GPIO_MODER_MODER10_Pos); // (10) режим альтернативной функции CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_10); //(0) двухтактный выход или push-pull сокращено PP MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR10_Msk, 0b11 << GPIO_OSPEEDER_OSPEEDR10_Pos); //(11) 50 MHz, высокочастотный выход MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR10_Msk, 0b00 << GPIO_PUPDR_PUPDR10_Pos); //(00) состояние после сброса, no pull up, pull down MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFRH2_Msk, 0b0111 << GPIO_AFRH_AFRH2_Pos); // 7 << (2 * 4) SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN); //Запустим тактирование USART1 USART1->BRR = 0xEA6; //19200 CLEAR_BIT(USART1->CR1, USART_CR1_OVER8); //0: Передискретизация равна 16 SET_BIT(USART1->CR1, USART_CR1_UE); //(1)USART включить MODIFY_REG(USART1->CR1, USART_CR1_M_Msk, 0b00 << USART_CR1_M_Pos); //(00) Word lenght 1 Start bit, 8 Data bits, n Stop bit SET_BIT(USART1->CR1, USART_CR1_RE); //(1) Влючить приемник Rx SET_BIT(USART1->CR1, USART_CR1_TE); //(1) Включить передатчик Tx SET_BIT(USART1->CR1, USART_CR1_RXNEIE); //(1) Прерывание по приему данных включено SET_BIT(USART1->CR1, USART_CR1_IDLEIE); //(1) Прерывание по флагу IDLE включено USART1->CR2 = 0; CLEAR_BIT(USART1->CR2, USART_CR2_STOP); //1 стоп бит USART1->CR3 = 0; USART1->GTPR = 0; USART1->ICR = 0; NVIC_EnableIRQ(USART1_IRQn); } работает нормально на отправку только когда меняю в строке режим работы на вход, но приемник при этом не работает Код: // PA10 (RxD) shall use the alternate function 7 (see data sheet) MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER10_Msk, 0b00 << GPIO_MODER_MODER10_Pos); //(00) вход Видимо запутался я с этими регистрами, помогите/подскажите?) |
|
| Автор: | Reflector [ Сб фев 03, 2024 11:27:05 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
Если после переконфигурирования RX начинает работать передача, то для начала нужно проверить не закорочены ли соседние RX с TX и точно ли подключаемся куда надо. Затем ставим бп после инициализации всей периферии и смотрим в отладчике действительно ли в регистрах GPIO находится то, что туда пытались записать. А в целом по коду особых косяков не вижу, разве что Pull Up бесполезен для TX и не помешал бы для RX, а у тебя все наоборот. |
|
| Автор: | kote52 [ Сб фев 03, 2024 13:48:28 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
припаян на плату BluePill от stm32f103, выводы не закорочены, сделал по вашему, нет приема только передача корректная работа. На лог анализаторе вижу то что отправляю. Обе линии в высоком уровне. Код: // USART1: Rx - PA10 , Tx - PA9 // PA9 (TxD) shall use the alternate function 7 (see data sheet) MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER9_Msk, 0b10 << GPIO_MODER_MODER9_Pos); // (10) режим альтернативной функции CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_9); //(0) двухтактный выход или push-pull сокращено PP MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR9_Msk, 0b00 << GPIO_PUPDR_PUPDR9_Pos); // (00) без подтяжки MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR9_Msk, 0b11 << GPIO_OSPEEDER_OSPEEDR9_Pos); //(11) 50 MHz, высокочастотный выход MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFRH1_Msk, 0b0111 << GPIO_AFRH_AFRH1_Pos); // 7 << (1 * 4) // PA10 (RxD) shall use the alternate function 7 (see data sheet) MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER10_Msk, 0b00 << GPIO_MODER_MODER10_Pos); //(00) input CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_10); //(0) двухтактный выход или push-pull сокращено PP MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR10_Msk, 0b01 << GPIO_PUPDR_PUPDR10_Pos); //(01) подтяжка к плюсу питания или pull-up сокращено PU MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR10_Msk, 0b11 << GPIO_OSPEEDER_OSPEEDR10_Pos); //(11) 50 MHz, высокочастотный выход MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFRH2_Msk, 0b0111 << GPIO_AFRH_AFRH2_Pos); // 7 << (2 * 4) В отладке смотрел регистры, все верно ставит. Проверил тактирование мк, все правильно косяков нет. У людей смтрю примеры вообще настроены только два регистра MODER и AFR и все. По сути они только и нужны. |
|
| Автор: | Reflector [ Сб фев 03, 2024 14:01:56 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
Input то не нужно на RX делать, это на старых портах для F1 работало, на всех остальных должен быть режим AF. |
|
| Автор: | kote52 [ Сб фев 03, 2024 14:26:38 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
Input то не нужно на RX делать, это на старых портах для F1 работало, на всех остальных должен быть режим AF. Код: // USART1: Rx - PA10 , Tx - PA9 // PA9 (TxD) shall use the alternate function 7 (see data sheet) MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER9_Msk, 0b10 << GPIO_MODER_MODER9_Pos); // (10) режим альтернативной функции CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_9); //(0) двухтактный выход или push-pull сокращено PP MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR9_Msk, 0b00 << GPIO_PUPDR_PUPDR9_Pos); // (00) сброс MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR9_Msk, 0b11 << GPIO_OSPEEDER_OSPEEDR9_Pos); //(11) 50 MHz, высокочастотный выход MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFRH1_Msk, 0b0111 << GPIO_AFRH_AFRH1_Pos); // 7 << (1 * 4) // PA10 (RxD) shall use the alternate function 7 (see data sheet) MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER10_Msk, 0b10 << GPIO_MODER_MODER10_Pos); //(10) режим альтернативной функции CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_10); //(0) двухтактный выход или push-pull сокращено PP MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR10_Msk, 0b01 << GPIO_PUPDR_PUPDR10_Pos); //(01) PU MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR10_Msk, 0b11 << GPIO_OSPEEDER_OSPEEDR10_Pos); //(11) 50 MHz, высокочастотный выход MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFRH2_Msk, 0b0111 << GPIO_AFRH_AFRH2_Pos); // 7 << (2 * 4) При таких настройках, одна буква "H" передается из "Hello World" когда нажмешь кнопку RESET. Но прием начинает работать. Код: void USART1_IRQHandler(void) {
if (READ_BIT(USART1->ISR, USART_ISR_RXNE)) { //RXNE - Сбрасывается автоматически при чтении регистра RDR. Также можно сбросить записью в этот бит нуля. //Если пришли данные по USART husart1.rx_buffer[husart1.rx_counter] = USART1->RDR; //Считаем данные в соответствующую ячейку в rx_buffer husart1.rx_counter++; //Увеличим счетчик принятых байт на 1 } if (READ_BIT(USART1->ISR, USART_ISR_IDLE)) { //Если прилетел флаг IDLE USART1->RDR; //Сбросим флаг IDLE husart1.rx_len = husart1.rx_counter; //Узнаем, сколько байт получили CMSIS_USART_Transmit(USART1, husart1.rx_buffer, husart1.rx_counter); //Отправим в порт то, что прилетело для проверки. husart1.rx_counter = 0; //сбросим счетчик приходящих данных } } void CMSIS_USART_Transmit(USART_TypeDef *USART, uint8_t *data, uint16_t Size) { for (uint16_t i = 0; i < Size; i++) { while (READ_BIT(USART->ISR, USART_ISR_TXE) == 0) ; //Ждем, пока линия не освободится USART->TDR = *data++; //Кидаем данные } } |
|
| Автор: | Нефертити [ Вс фев 04, 2024 00:34:09 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
Наверное, забыли USART1 clock source selection в RCC_CFGR3 занести. |
|
| Автор: | КРАМ [ Вс фев 04, 2024 07:55:10 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
Тогда бы весь модуль не работал. А у автора передача работает. |
|
| Автор: | kote52 [ Вс фев 04, 2024 09:25:59 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
Нефертити, RCC_CFGR3->USART1SW я смотрел его в отладке, он - 00: PCLK selected as USART1 clock source (default) или нужно было сбросить наверняка? Скину еще настройки тактирования мк Код: void CMSIS_RCC_SystemClock_72MHz(void) {
//Настройка 72MHz SET_BIT(RCC->CR, RCC_CR_HSION); //(1)Запустили внутрений RC генератор на 8 MHz while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == 0); //Дождемся поднятия флага о готовности CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); //(0) SET_BIT(RCC->CR, RCC_CR_HSEON);//(1) //Запустим внешний кварцевый резонатор на 8 MHz while (READ_BIT(RCC->CR, RCC_CR_HSEON) == 0); //Дождемся поднятия флага о готовности //SET_BIT(RCC->CR, RCC_CR_CSSON); //(1)Вкл. CSS CLEAR_BIT(RCC->CR, RCC_CR_CSSON); //(0)Выкл .CSS MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, FLASH_ACR_LATENCY_1); //(010) Two wait states, if 48 MHz < SYSCLK <= 72 MHz SET_BIT(FLASH->ACR, FLASH_ACR_PRFTBE); //(1) Prefetch is enabled SET_BIT(FLASH->ACR, FLASH_ACR_PRFTBS); //(1) Prefetch buffer is enabled MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_CFGR_SW_PLL); //(10)Выберем PLL в качестве System Clock MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_CFGR_HPRE_DIV1); //(0)AHB Prescaler /1 MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_CFGR_PPRE1_DIV2); //(100) APB1 Prescaler /2, т.к. PCLK1 max 36MHz MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, RCC_CFGR_PPRE2_DIV1); //(0) APB2 Prescaler /1. 72MHz. MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLSRC, RCC_CFGR_PLLSRC_HSE_PREDIV); //(10) В качестве входного сигнала для PLL выберем HSE MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PREDIV_Msk, 0b0000 << RCC_CFGR2_PREDIV_Pos); //(0000) PREDIV коэффициент деления PREDIV. MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLXTPRE, RCC_CFGR_PLLXTPRE_HSE_PREDIV_DIV1); //(0000) HSE input to PLL not divided предделение перед PLL /1 MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLMUL, RCC_CFGR_PLLMUL9); //(0111) т.к. кварц на 8Mhz, а нужно 72MHz CLEAR_BIT(RCC->CFGR, RCC_CFGR_USBPRE); //(1) OFF или (0) Для USB 72MHz/1.5 = 48MHz SET_BIT(RCC->CR, RCC_CR_PLLON); //PLL Вкл. while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) == 0);//Дождемся поднятия флага о готовности PLL } |
|
| Автор: | КРАМ [ Вс фев 04, 2024 09:54:17 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
В вашем коде нет включения тактирования периферии. |
|
| Автор: | kote52 [ Вс фев 04, 2024 10:06:37 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
В вашем коде нет включения тактирования периферии. Какую именно вы периферию имеете в виду? В первом моем сообщение самые первые строчки кода: Код: SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOAEN); //Настроили тактирование PORT A я вас правильно понял? |
|
| Автор: | КРАМ [ Вс фев 04, 2024 10:34:25 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
Каждый модуль, включая УАРТ-ы имеют отдельное тактирование от домена осциллятора. Включение тактирования портов недостаточно. И я говорил лишь о последнем приведенном коде. |
|
| Автор: | kote52 [ Вс фев 04, 2024 10:48:16 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
Включение тактирования портов недостаточно. ну хорошо в USART_Init(); прописано включение тактирования, первое сообщение. Код: SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN); //Запустим тактирование USART1
|
|
| Автор: | КРАМ [ Вс фев 04, 2024 11:02:48 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
Ну и замечательно. Если тактирование включено, значит должен работать в полном составе. |
|
| Автор: | Нефертити [ Вс фев 04, 2024 15:35:48 ] | ||||
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO | ||||
kote52, на начальную настройку всего в ручном режиме уходит очень много времени. Это время можно использовать для чего-нибудь другого. Я, для себя, пришёл к выводу, что всей этой начальной настройкой пусть занимается CubeIDE, достаточно указать ему использовать LL. Я своё время лучше потрачу на поиски чего-нибудь другого. Во вложении для ректификационной колонны делал небольшой проект на STM324F030F4P6. 4 термометра, давление в кубе на модуле с Ali, атмосферное давление на BMP180, 2 кнопки, и управление клапаном. Фотки
|
|||||
| Автор: | kote52 [ Вс фев 04, 2024 17:41:44 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
Всем откликнувшимся спасибо, все заработало нормаль, как только отключил SET_BIT(USART1->CR1, USART_CR1_IDLEIE); //(1) Прерывание по флагу IDLE включено. Объяснить пока это не могу. И настройки портов оставил: вкл альтернативная функция, и pull up. |
|
| Автор: | КРАМ [ Вс фев 04, 2024 17:45:00 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
А что вы пытались поймать по IDLE? У вас прием в кольцевой буфер? |
|
| Автор: | kote52 [ Вс фев 04, 2024 18:30:44 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
А что вы пытались поймать по IDLE? В обработчике прерываний была вот такая конструкция, еë соответсвенно тоже убрал. Код: if (READ_BIT(USART1->ISR, USART_ISR_IDLE)) {
//Если прилетел флаг IDLE USART1->RDR; //Сбросим флаг IDLE husart1.rx_len = husart1.rx_counter; //Узнаем, сколько байт получили CMSIS_USART_Transmit(USART1, husart1.rx_buffer, husart1.rx_counter); //Отправим в порт то, что прилетело для проверки. husart1.rx_counter = 0; //сбросим счетчик приходящих данных } |
|
| Автор: | КРАМ [ Вс фев 04, 2024 18:49:17 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
А можно привести весь обработчик и показать принимаемый пакет (диаграмму)? Есть смутное подозрение, что вы допускали переполнение приемника... |
|
| Автор: | kote52 [ Вс фев 04, 2024 18:59:46 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
А можно привести весь обработчик Код обработчика выложен полностью чуть выше ващего первого сообщения в данной теме, пишу с телефона не удобно полность перезалить и возможности нет пока. |
|
| Автор: | a797945 [ Вс фев 04, 2024 19:26:42 ] |
| Заголовок сообщения: | Re: st32f303cct6 USART настройка GPIO |
del удалил - сообщение было не во всем корректно. но вызывать передачу строки в обработчике прерывания ни есть гуд. |
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


