Страница 1 из 2
USART шлет на комп фигню, а прерывания на прием не работают.
Добавлено: Пт окт 24, 2014 16:08:30
TmYAG
Всем здравствуйте! Начал изучать прием и передачу по USART на дискавери Ф4
Купил USB-UART преобразователь на FT232RL
Начал понемногу используя "кухаркины статьи" xD писать свой код)))
Сначала ни приема ни передачи на комп/с компа не было. Затем я догадался что надо на PA9 подключить альтернативную функцию.
Затем где-то вычитал, что для приема так же на PA10 надо альтернативную функцию повесить. В итоге Передача работает (Но не совсем так как я ожидал). Косяк в том. что в терминале я вижу не то что программа отсылает.
Например пробовал отсылать 1 (даже в наглую USART1->DR = 1;) в терминале вижу E0
А при приеме прерывания совсем не вызываются(((
Код: Выделить всё
#include "stm32f4xx.h"
void USART1_IRQHandler()
{
if (USART1->SR & USART_SR_RXNE) {
USART1->SR&=~USART_SR_RXNE;
if(USART1->DR=='1') {
GPIOD->ODR = 0xF000;
}
}
}
int main()
{
RCC->APB2ENR |= RCC_APB2ENR_USART1EN|RCC_APB2ENR_SYSCFGEN;;
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN;
GPIOD->MODER|= 0x55000000;
GPIOD->OTYPER = 0;
GPIOD->OSPEEDR = 0;
GPIOA->MODER |= 0x80000;
GPIOA->AFR[1] |= 0x770;
GPIOA->OTYPER = 0;
USART1->CR1 |= USART_CR1_UE|USART_CR1_RE|USART_CR1_TE;
USART1->BRR |=0x9c4;
USART1->CR1 |= USART_CR1_RXNEIE;
NVIC_EnableIRQ (USART1_IRQn);
__enable_irq ();
while(1)
{
while(!(USART1->SR & USART_SR_TC));
USART1->DR = 'H';
for(uint32_t i = 0; i < 2000000; i++);
}
}
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Пт окт 24, 2014 16:19:46
TmYAG
По поводу приема. в прерывание свалился. Оказывается надо и для порта PA10 в MODER указать альтернативную функцию (я указал вход) а в AFR для него задал альтернативную ф-ю
в итоге 0х80000 меняется на 0х280000.
Но! делал проверку что я с терминала шлю на МК и заставлял его в прерывании отослать это же обратно. Это совершенно разные значения(((
Код: Выделить всё
#include "stm32f4xx.h"
void USART1_IRQHandler(void)
{
if (USART1->SR & USART_SR_RXNE) {
USART1->SR&=~USART_SR_RXNE;
if(USART1->DR=='1') {
GPIOD->ODR = 0xF000;
}
USART1->DR = USART1->DR;
}
}
int main()
{
RCC->APB2ENR |= RCC_APB2ENR_USART1EN|RCC_APB2ENR_SYSCFGEN;;
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN;
GPIOD->MODER|= 0x55000000;
GPIOD->OTYPER = 0;
GPIOD->OSPEEDR = 0;
GPIOA->MODER |= 0x280000;
GPIOA->AFR[1] |= 0x770;
GPIOA->OTYPER = 0;
USART1->CR1 |= USART_CR1_UE|USART_CR1_RE|USART_CR1_TE;
USART1->BRR |=0x9c4;
USART1->CR1 |= USART_CR1_RXNEIE;
NVIC_EnableIRQ (USART1_IRQn);
__enable_irq ();
while(1)
{
while(!(USART1->SR & USART_SR_TC));
USART1->DR = '1';
for(uint32_t i = 0; i < 2000000; i++);
}
}
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Пт окт 24, 2014 19:15:17
dosikus
Личку смотри ...
На PA9 и PA10 висят мешалки.
Перебрасывай на PB6 и PB7 :
Код:
Код: Выделить всё
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; //USART clock
RCC->AHB1ENR |=RCC_AHB1ENR_GPIOBEN; //GPIOB clock
GPIOB->AFR[0] |= (7<<28)|(7<<24); // AF7 for PB6 & PB7
GPIOB->MODER &=~
GPIO_MODER_MODER6 |
GPIO_MODER_MODER7
;
GPIOB->MODER|=
GPIO_MODER_MODER6_1|
GPIO_MODER_MODER7_1
;
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Сб окт 25, 2014 22:36:17
TmYAG
А не могли бы Вы отправить меня на нужную страницу мануала? А то я никак не могу найти на какие пины какая периферия ремапится. Хотя бы табличку какую.
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Сб окт 25, 2014 23:01:25
HHIMERA
Это не в мануале... это в даташите... Таблица сразу после таблицы пинов...
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Вс окт 26, 2014 21:18:17
TmYAG
И прием и передача работают, но криво. На выходе в терминале фигня. Не те символы, что я засылаю(
Код: Выделить всё
#include "stm32f4xx.h"
#define APB2CLK 8000000UL
#define BAUDRATE 2400UL
void USART1_IRQHandler()
{
if (USART1->SR & USART_SR_RXNE) {
USART1->SR&=~USART_SR_RXNE;
uint16_t temp = USART1->DR;
if(USART1->DR=='1') {
GPIOD->ODR = 0xF000;
}
USART1->DR = temp;
}
}
int main()
{
RCC->APB2ENR |= RCC_APB2ENR_USART1EN|RCC_APB2ENR_SYSCFGEN;;
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN|RCC_AHB1ENR_GPIODEN;
GPIOD->MODER|= 0x55000000;
GPIOD->OTYPER = 0;
GPIOD->OSPEEDR = 0;
GPIOB->MODER |= 0xA000;
GPIOB->AFR[0] |= 0x77000000;
GPIOB->OTYPER = 0;
USART1->CR1 |= USART_CR1_UE|USART_CR1_RE|USART_CR1_TE;
//uint32_t BR = (APB2CLK+BAUDRATE/2)/BAUDRATE;
USART1->BRR |= 0x1A1C;
USART1->CR1 |= USART_CR1_RXNEIE;
NVIC_EnableIRQ (USART1_IRQn);
__enable_irq ();
while(1)
{
while(!(USART1->SR & USART_SR_TC));
USART1->DR = 1;
for(uint32_t i = 0; i < 2000000; i++);
}
}
Полный проект. Тулзой STMовской файл сгенерил.
- 1.zip
- (952.78 КБ) 296 скачиваний
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Вс окт 26, 2014 21:47:47
dosikus
Танцы с бубном продолжаются ...
Короче завтра исправлю, выложу .
Когда соизволишь начать читать документацию?
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Вс окт 26, 2014 21:55:36
TmYAG
dosikus писал(а):Когда соизволишь начать читать документацию?
Ну в общем я ее читаю. Причем под конкретную задачу, которую стремлюсь выполнить)
А вот то, что я дико невнимателен, до тех пор меня моськой в косяк не ткнут, это факт(
Предполагаю, что я в BRR накосячил))
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Пн окт 27, 2014 07:57:39
dosikus
Спрашивай что не понятно.
USART1 PB6 и PB7, скорость 115200 .
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Пн окт 27, 2014 11:05:08
TmYAG
А откуда частота шины APB2 84МГц?
Или я путаю? Я же файл генерил для HSE 8MHz или эти вещи не связаны?
И если так по большому счету, что в моей проге не так было? Только Baudrate разный и вроде все? Проинициализировал верно, разрешил прерывания по приему. Порт B сконфигурировал на альт. ф-ю.
И еще ворпрос SYSCFG разве не за альтернативную ф-ю отвечает? Тогда почему когда я прерывания по нажатию на кнопку делал его надо было затактировать?
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Пн окт 27, 2014 11:52:40
dosikus
Кварц 8МГц , SYSCLK 168МГЦ , APB2 84МГЦ .
USART1 тактируется от APB2 .
SYSCFG - мультиплексор EXTI ремап памяти и выбор интерфейса Ethernet PHY , выбор AF в
GPIOx_AFRх
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Пн окт 27, 2014 19:10:27
TmYAG
Удивительно! Действительно косяк был в BR
И тогда уж еще один вопросик!
Код: Выделить всё
void USART_Ch(char ch)
{
while(!(USART1->SR & USART_SR_TC));
USART1->DR = ch;
}
Вот решил разбить программу на функции. В файле main создал функцию передачи одного символа. В главной функции в while(1) выполняю, но IAR ругается.
Error[Pe159]: declaration is incompatible with previous "USART_Ch" (declared <SRCREF line=38>at line C:\Users\Виктор\Documents\STM32\1\main.c 43
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Пн окт 27, 2014 19:29:30
dosikus
TmYAG, проект кидай .
Кстати кириллица в путях тебе еще много бяк наделает ...
И далее где ты это скопипастил ???? :
Код: Выделить всё
void USART_Ch(char ch)
{
while(!(USART1->SR & USART_SR_TC));
USART1->DR = ch;
}
В том примере что я дал уже есть передача одиночного символа с корректной проверкой TXE а не TC :
Код: Выделить всё
void Usart_Transmit(uint8_t Data)
{
while(!(USART1->SR & USART_SR_TXE));
USART1->DR = Data;
}
Чем он то не устраивает.
И что значит разбить на функции.
Все функции уже в модуле usart1 ...
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Пн окт 27, 2014 19:38:00
TmYAG
Не обижайся! Я с планшета глядел)) Времени проверить не было))) Ща до дома доеду и кину проект. Если честно это не копипаст а мое поделие/
А в чем принципиальное отличие проверки пустого буфера и конца передачи?
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Пн окт 27, 2014 19:45:32
dosikus
Да это не обиды .
Если кажется что я громко озвучиваю - считай я пытаюсь заострить твое внимание на этом !
Дабы на грабли не попал...
О
TC и TXE
Bit 7TXE: Transmit data register empty
This bit is set by hardware when the content of the TDR register has been transferred into
the shift register. An interrupt is generated if the TXEIE bit =1 in the USART_CR1 register. It
is cleared by a write to the USART_DR register.
0: Data is not transferred to the shift register
1: Data is transferred to the shift register)
Note: This bit is used during single buffer transmission.
Bit 6TC: Transmission complete
This bit is set by hardware if the transmission of a frame containing data is complete and if
TXE is set. An interrupt is generated if TCIE=1in the USART_CR1 register. It is cleared by
a software sequence (a read from the USART_SR register followed by a write to the
USART_DR register). The TC bit can also be cleared by writing a '0' to it. This clearing
sequence is recommended only for multibuffer communication.
0: Transmission is not complete
1: Transmission is complete
Перевести ?
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Вт окт 28, 2014 12:51:42
TmYAG
Собственно вот проект)))
У меня на работе и на домашней машине они разные) код туды-сюды гоняю только)))
Вылезает ошибка Error[Pe159]: declaration is incompatible with previous "USART_SendCh" (declared at line 36) D:\Programming Lessons\STM32\IAR\Lesson 3. USART\main.c 41
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Вт окт 28, 2014 13:37:48
dosikus
Во первых у тебя снова абсолютные пути к хэдерам .
А нужно было прописать всего один относительный к папке inc .
Снова подключен старый стартап , когда я тебе уже давал проект шаблон со всем необходимым.
Далее - не понимаю зачем городить все в одном файле, когда я тебе дал модульный проект .
Ну а если так приспичило ляпать все в одном - будь любезен объявить функцию до ее применения или прописать прототип .
Код: Выделить всё
#include "stm32f4xx.h"
#define APB2CLK 84000000UL
#define BAUDRATE 9600UL
void USART_SendCh(uint8_t); <-----
void USART1_IRQHandler(void)
{
if (USART1->SR & USART_SR_
Такие задержки абсолютное зло .
Вместо них .
Объявляем переменную, хэндлер и функцию.
Код: Выделить всё
static volatile uint32_t TimingDelay;
/* Delay & timers */
void SysTick_Handler(void) {
if (TimingDelay) {
TimingDelay--;
}
}
void Delay_mS(uint32_t nTime) {
TimingDelay = nTime;
while (TimingDelay);
}
В main инитим SysTick :
И пользуем
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Вт окт 28, 2014 14:30:18
TmYAG
На счет стартапов! Точно же!
На счет модульности. Я ща потихонечку для себя пилю модули для работы с GPIO, USART, EXTI и т.д.
Пока на этапе освоения, приходится ляпать в один файл, чтобы исправляя не лазить по разным файлам и заголовкам.
С SysTick да и вообще таймерами я пока не разбирался. Но согласен. Если будут задачи требующие точного времени, таймеры необходимость.
Ага, стало быть нужны прототипы функций.
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Вт окт 28, 2014 15:11:53
dosikus
Ок . Если что спрашивай ...
А SYSTick - просто прими как есть ,
на этапе изучения нубам всегда нужны задержки

))))))))))
Re: USART шлет на комп фигню, а прерывания на прием не работ
Добавлено: Вт окт 28, 2014 15:17:45
TmYAG
А вообще спасибо тебе огромное! Я очень многое благодаря тебе понял=)