Страница 4 из 5
Re: STM32F0 и USART
Добавлено: Вт дек 10, 2013 15:00:55
dosikus
Код: Выделить всё
USART->CR1 =USART_CR1_TE|USART_CR1_RE |USART_CR1_RXNEIE;
USART1->CR2 &= ~USART_CR2_STOP;
NVIC_SetPriority(USART1_IRQn, 15);
NVIC_EnableIRQ(USART1_IRQn);
USART->CR1 =USART_CR1_UE ;
Bits 13:12STOP[1:0]: STOP bits
These bits are used for programming the stop bits.
00: 1 stop bit
01: Reserved.
10: 2 stop bits
11: 1.5 stop bit
This bit field can only be written when the USART is disabled (UE=0)
Как и многие другие биты ...
Re: STM32F0 и USART
Добавлено: Пт фев 05, 2016 19:27:46
godz320
Kvasshtain писал(а):Здравствуйте уважаемый Dosikus. Рад Вас видеть

. У меня STM32F051. Не ясно что записывать в AFR[1], и как это делать для других случаев. Т.е. я не понимаю откуда взялось число 0x0110, ну или по другому (1<<(2*4))|(1<<(1*4))?
добрый день,
действительно, почему тут устанавливаем биты именно так 0x0110?
Для чего тогда секция в файле stm32f051.s:
/****************** Bit definition for GPIO_AFRL register ********************/
#define GPIO_AFRL_AFR0 ((uint32_t)0x0000000F)
#define GPIO_AFRL_AFR1 ((uint32_t)0x000000F0)
#define GPIO_AFRL_AFR2 ((uint32_t)0x00000F00)
#define GPIO_AFRL_AFR3 ((uint32_t)0x0000F000)
#define GPIO_AFRL_AFR4 ((uint32_t)0x000F0000)
#define GPIO_AFRL_AFR5 ((uint32_t)0x00F00000)
#define GPIO_AFRL_AFR6 ((uint32_t)0x0F000000)
#define GPIO_AFRL_AFR7 ((uint32_t)0xF0000000)
/****************** Bit definition for GPIO_AFRH register ********************/
#define GPIO_AFRH_AFR8 ((uint32_t)0x0000000F)
#define GPIO_AFRH_AFR9 ((uint32_t)0x000000F0)
#define GPIO_AFRH_AFR10 ((uint32_t)0x00000F00)
#define GPIO_AFRH_AFR11 ((uint32_t)0x0000F000)
#define GPIO_AFRH_AFR12 ((uint32_t)0x000F0000)
#define GPIO_AFRH_AFR13 ((uint32_t)0x00F00000)
#define GPIO_AFRH_AFR14 ((uint32_t)0x0F000000)
#define GPIO_AFRH_AFR15 ((uint32_t)0xF0000000)
Re: STM32F0 и USART
Добавлено: Вт фев 09, 2016 20:09:05
godz320
помогите начинающему понять
для удобства, сам себе смог предложить только это:
GPIOA->AFR[1] |= GPIO_AFRH_AFR9_AF1 | GPIO_AFRH_AFR10_AF1;
предварительно добавил это:
#define GPIO_AFRH_AFR9_AF1 ((uint32_t)0x00000010)
#define GPIO_AFRH_AFR10_AF1 ((uint32_t)0x00000100)
либо уж тогда писать так:
*(uint32_t*)0x48000024 |= 0x0110;
а что означает синтаксис (1<<(2*4))|(1<<(1*4)) ?
Re: STM32F0 и USART
Добавлено: Вт фев 09, 2016 20:39:01
dosikus
К примеру - GPIOA->AFR[0]|=2<<(4*2);
Первая 2 это альтернативная функция, находиться по таблице в даташите, 4 -именно столько занимает каждый пин в регистре AFR , а вторая 2 порядковый номер пина. В итоге мы имеем число определяющее альтернативную функцию и число в скобках на сколько бит сдвинуть. И довольно таки читаемо
Мы видим число определяющее альтернативную функцию и порядковый номер пина. Можно дефайнами конечно заменить.
Re: STM32F0 и USART
Добавлено: Вт фев 09, 2016 20:47:38
HHIMERA
godz320 писал(а):
для удобства
Для удобства... выдрать из СПЛ... да и все дела...
Код: Выделить всё
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
{
uint32_t temp = 0x00;
uint32_t temp_2 = 0x00;
temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
// GPIO_PinAFConfig(GPIOA, 13, 5);
}
Re: STM32F0 и USART
Добавлено: Вт фев 09, 2016 20:54:38
godz320
спасибо!! Пока нечего не понял,
но можно объяснить на данном примере?
GPIOA->AFR[1] | = 0x0110;
если я правильно понял, то это тождественно:
GPIOA->AFR[1] | = (1<<(2*4))|(1<<(1*4))
Re: STM32F0 и USART
Добавлено: Вт фев 09, 2016 21:02:27
godz320
HHIMERA писал(а):
выдрать из СПЛ... да и все дела...
да хотелось бы конечно в процессе изучения использовать только даташит и набитые дефайны от производителя.
Re: STM32F0 и USART
Добавлено: Вт фев 09, 2016 21:04:47
dosikus
AFR 32 битные , а ты предоставил 16 битное значение. Посмотри в RM описание AFR и приведи свое число к 32 битам и все станет на свои места
Re: STM32F0 и USART
Добавлено: Вт фев 09, 2016 21:23:34
godz320
AFR 32 битные
это я запомнил (stm
32), навряд ли есть регистры 8 или 16 битные.
а ты предоставил 16 битное значение.
это не я предоставил, а вы. Цитата из первой страницы этой темы:
Спойлер
wss60 писал(а):
Теперь другая проблема: компилятор “ругается” на регистр AFRH!?
Код:
void Init_usart(void)
{
GPIOA->AFRH |= 0x0110; // <----- !!!
Можно же ради приличия слазать в stm32f0xx.h
Код:
GPIOA->AFR[1]= (1<<(2*4))|(1<<(1*4));
Посмотри в RM описание AFR и приведи свое число к 32 битам и все станет на свои места
На самом деле мне безраличен сейчас AFR, RM, 32 бита. Мне интересна конструкция ввида
(1<<(2*4))|(1<<(1*4))
Re: STM32F0 и USART
Добавлено: Вт фев 09, 2016 21:37:49
dosikus
Ну так не я же пихал 16 битное.
Читайте запись так сдвинуть 1 на 4 бита и сдвинуть 1 на 8 бит. Теперь откройте все же описание AFR в RM и посмотрите что находиться на этих позициях.
Re: STM32F0 и USART
Добавлено: Ср фев 10, 2016 11:46:51
pixar
выдрать из СПЛ... да и все дела...
зачем выдирать из спл ?
через месяц ломать голову - что там автор хотел сказать?
спл для F0 вполне рабочая.
Re: STM32F0 и USART
Добавлено: Ср фев 10, 2016 12:03:55
HHIMERA
А зачем она вообще нужна... СПЛ??? Да ещё и для Ф0...
И что там ломать голову... если всё есть в хедере... почти...
И можно подумать... что СПЛ улучшает понимание чего-то там... наоборот... отдаляет...
Re: STM32F0 и USART
Добавлено: Вс апр 22, 2018 14:35:13
Frogfot
Народ, начал юзать STM32F0 DISCO на STM32F051, запустил USART1 по примеру из этого топика, добавил прерывания - прерывания по USART_ISR_RXNE и USART_ISR_TC идут, нет прерываний по приёму. Кому не в лом, плз гляньте инициализацию и прерывание:
Код: Выделить всё
// ======= Init SPI2 =======
void Init_USART1 (void)
{
// PA9 -> USART1_TX, PA10 - USART1_RX
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // Enable Clock USART1
RCC->APB2ENR |= RCC_AHBENR_GPIOAEN; // Enable Clock GPIOA
GPIOA->MODER |= GPIO_MODER_MODER9_1; // PA9 (TX) - Alternate function mode
GPIOA->MODER |= GPIO_MODER_MODER10_1; // PA10 (RX) - Alternate function mode
GPIOA->AFR[1] |= 0x0110; // Alternate function at AF1
GPIOA->OTYPER = 0; // Output push-pull
GPIOA->PUPDR = 0; // No pull-up, no pull-down
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9; // PA9 (TX) - High speed
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10; // PA10 (RX) - High speed
RCC->CFGR3 &= ~RCC_CFGR3_USART1SW; // Set System Clock (SYSCLK) USART1
RCC->CFGR3 |= RCC_CFGR3_USART1SW_0;
// USART1->BRR = 0x681; //Скорость обмена 9600
USART1->BRR = 0x3FFF;
// USART1->BRR = 0xFFFF;
USART1->CR1 &= ~USART_CR1_M; //Данные - 8 бит
USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит
USART1->CR1 |= USART_CR1_RE; // Enable Receiver
USART1->CR1 |= USART_CR1_TE; // Enable Transmitter
USART1->CR1 |= USART_CR1_RXNEIE; // RX Complete Interrupt Enable
USART1->CR1 |= USART_CR1_TCIE; // Transmission Complete Interrupt Enable
// USART1->CR1 |= USART_CR1_TXEIE; // Transmitter Empty Interrupt Enable
USART1->CR1 |= USART_CR1_UE; // Enable USART1
NVIC_EnableIRQ (USART1_IRQn); // Enable Interrupt USART1
USART1->TDR = 0x55; // Begin Transmitte
}
Код: Выделить всё
// ===== USART1 TX Empty Interrupt =======
void USART1_IRQHandler (void)
{
if (USART1->ISR & USART_ISR_RXNE) // Read data register not empty
{
char USART1_Data = USART1->RDR;
if (CntRXUSART1++ & 0xF0) { LEDBLUE_DIS; }
else { LEDBLUE_EN; }
}
if (USART1->ISR & USART_ISR_TC) // Transmission complete
{
USART1->TDR = 0x55;
if (CntTXUSART1++ & 0xF0) { LEDGREEN_DIS; }
else { LEDGREEN_EN; }
}
}
По счётчикам CntRXUSART1 и CntTXUSART1 мигаю светодиодами на плате.
Re: STM32F0 и USART
Добавлено: Вс апр 22, 2018 15:09:26
Reflector
А зачем ты RX настроил как выход?
Re: STM32F0 и USART
Добавлено: Вс апр 22, 2018 16:11:09
Frogfot
[uquote="Reflector",url="/forum/viewtopic.php?p=3360246#p3360246"]А зачем ты RX настроил как выход?[/uquote]
pls напиши что я сделал неправильно и как нужно правильно, STM32 только начал учить.
подключил на PA9 св.диод - глухо, выхода нет, тоже чёго-то неправильно настроил
Re: STM32F0 и USART
Добавлено: Вс апр 22, 2018 21:59:21
Myp3ik
Ничего не настораживает ?
Спойлер
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
Re: STM32F0 и USART
Добавлено: Пн апр 23, 2018 08:31:06
Frogfot
[uquote="Myp3ik",url="/forum/viewtopic.php?p=3360572#p3360572"]
Ничего не настораживает?[/uquote]
Благодарю, сам в упор не видел, исправлю, на выходе TX ничего нет, теперь понятно, что тактирования не было на порт.
Исправил, прошил, выход TX заработал, уже утром буду дальше ковырять.
Добавлено after 8 hours 54 minutes 12 seconds:
Ещё раз благодарю, приём есть, прерывания срабатывают, счётчики прерываний считают, светодиды мигают.
Re: STM32F0 и USART
Добавлено: Ср дек 19, 2018 11:33:27
dolpheen
Настроил USART1, по примерам, но после запуска контроллер "виснет" на Default handelr. Посмотрел память, действительно, в таблице векторов на обработчик USART1 стоит адрес дефолтного обработчика.
Т.е. по-видимому weak функция обработчика не переопределяется.
Подскажите, плиз, в чем может быть проблема?
Код: Выделить всё
int main(void)
{
// System Initialization
SystemCoreClockUpdate();
/* Initialize RTOS */
osKernelInitialize(); // Initialize CMSIS-RTOS
// PORTA, PORTC AHB peripheral clock enable register (RCC_AHBENR) for GPIOs, DMA
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
RCC->AHBENR |= RCC_AHBENR_GPIOCEN;
// Initialize USART1 Interface
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
RCC->CFGR3 &= ~RCC_CFGR3_USART1SW;
RCC->CFGR3 |= RCC_CFGR3_USART1SW; //HSI selected as USART1 clock
// TX
GPIOA->MODER |= _VAL2FLD(GPIO_MODER_MODER9, 0x2);
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_9; // Reset bit
GPIOA->PUPDR |= _VAL2FLD(GPIO_PUPDR_PUPDR9, GPIO_PuPd_DOWN);
GPIOA->OSPEEDR |= _VAL2FLD(GPIO_OSPEEDR_OSPEEDR9, GPIO_Speed_Level_3);
GPIOA->AFR[1] |= _VAL2FLD(GPIO_AFRH_AFSEL9, 0x1);
// RX
GPIOA->MODER |= _VAL2FLD(GPIO_MODER_MODER10, 0x0);
GPIOA->PUPDR |= _VAL2FLD(GPIO_PUPDR_PUPDR10, GPIO_PuPd_NOPULL);
GPIOA->OSPEEDR |= _VAL2FLD(GPIO_OSPEEDR_OSPEEDR10, GPIO_Speed_Level_3);
GPIOA->AFR[1] |= _VAL2FLD(GPIO_AFRH_AFSEL10, 0x1);
USART1->BRR = 0x46;
USART1->CR1 |= USART_CR1_UE;
USART1->CR1 &= ~USART_CR1_M; //Данные - 8 бит
USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит
USART1->CR1 |= USART_CR1_TE;
USART1->CR1 |= USART_CR1_RE;
USART1->CR1 |= USART_CR1_RXNEIE;
NVIC_EnableIRQ(USART1_IRQn);
/* Initialize output PC8 (blue LED) */
osThreadNew(app_main, NULL, NULL); // Create application main thread
osThreadNew(gsm_power, NULL, NULL); // Create GSM Power thread
osThreadNew(onoff_key, NULL, NULL); // Create onoff key monitoring thread
osThreadNew(usart1_thread, NULL, NULL); // Create onoff key monitoring thread
osKernelStart(); // Start thread execution
for (;;) {}
// for(;;){
// // Read input state of button PA0
// if(GPIOA->IDR & GPIO_IDR_0){
// //GPIOB->BSRR |= GPIO_BSRR_BR_8;
// }else{
// //GPIOB->BSRR |= GPIO_BSRR_BS_8;
// }
// }
}
/***********************************/
/*** прерывание по приему данных ***/
/***********************************/
volatile unsigned int usart_temp;
void USART1_IRQHandler(void)
{
if((USART1->ISR & USART_ISR_RXNE)!=0)
{
usart_temp = USART1->RDR;
}
}
Добавлено after 10 minutes 26 seconds:
Разобрался))
Посмотрел на выход компилятора, по map файлу дефолтный обработчик проходил по имени как "USART1_IRQHandler", а моя функция как "USART1_IRQHandler()"
У меня проект на C++, поставил перед описанием extern "C", всё завелось.
Re: STM32F0 и USART
Добавлено: Ср дек 19, 2018 11:36:56
VladislavS
Если где-то засветился С++ компилятор, то надо так
Код: Выделить всё
extern "C" void USART1_IRQHandler()
{
//...
}
Ну, ок, сам разобрался.
Re: STM32F0 и USART
Добавлено: Вс янв 13, 2019 16:20:40
pokk
Начал ковырять, stm32f030, не могу понять почему после того как остановил прием отладчиком, следующий байт не выставляет флаг RXNE
Принимаю байт так:
Код: Выделить всё
uint8_t ReadByte(USART_TypeDef* USARTx){
while(!(USARTx->ISR & USART_ISR_RXNE)){};
return USARTx->RDR;
}
Инициализация минимальная
Спойлер
void InitDriverUsart(USART_TypeDef* USARTx,uint32_t boudrate,Remap_t remap){
uint16_t temp;
if(USARTx==USART1){
RCC->APB2ENR |=RCC_APB2ENR_USART1EN;
temp=(CPU_APB2+boudrate/2)/boudrate; //так как на разных шинах сидят /2 зависит от шины и настроек
//-----------------------------------------
if(remap){
}else{
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
gpio_conf(GPIOA, 10, MODE_AF, TYPE_PUSHPULL, SPEED_2MHz, PULLUP_UP, 1); //RX
gpio_conf(GPIOA, 9, MODE_AF, TYPE_PUSHPULL, SPEED_2MHz, PULLUP_UP, 1); //TX
}
//-----------------------------------------
}
//-----------------------------------------
//-----------------------------------------
USARTx->CR1 &= USART_CR1_UE;
USARTx->CR1 = 0x00000000; /* (2) */
USARTx->CR2 = 0x00000000; /* (3) */
USARTx->BRR =temp; /* (4) */
USARTx->CR1 |= ( USART_CR1_TE | USART_CR1_RE ); /* (6) */
USARTx->CR1 |= USART_CR1_UE; /* (5) */
//------------------------------------------
}
Main:
Код: Выделить всё
int main(){
InitDriverUsart(USART1,7600,NOT_REMAP);
while(1){
ReadByte(USART1);
ReadByte(USART1);
ReadByte(USART1);
ReadByte(USART1);
ReadByte(USART1);
ReadByte(USART1);
NOP;
}
}
Если поставить брекпоинт на NOP то после мк зависает на ожидании флага, хотя данные сами идут смотрю анализатором, ну и в одном из байте передается номер посылки, и он меняеться пока не остановил брек поинтом