STM8l151 USART

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Jem_Jem
Родился
Сообщения: 18
Зарегистрирован: Пт май 17, 2013 21:52:00

STM8l151 USART

Сообщение Jem_Jem »

Доброго времени суток!

Работаю с китом STM8L. Задача завести USART на STM8L151.
Нашел большое количество примеров, но тем не менее USART молчит. Выставил тактирование от внутреннего генератора, поставил порт на вывод. Смотрел по осцилографу, слушал COM порт - тишина.

Пытаясь бесконечно подать на выход USART одну и ту же величину использовал такой код:

Код: Выделить всё

#define STM8L15X_MD
#include "iostm8l152c6.h"
#include "stm8l15x.h"

void  main(){

     PC_DDR_bit.DDR3=1; //PС3 - на вывод.
     PD_CR1_bit.C13 = 1;   // Выход типа Push-pull
     PD_CR2_bit.C23 = 1;
  
CLK->ICKCR |= CLK_ICKCR_HSION;
CLK_ICKCR_HSION=1; // Разрешаем работу генератора с внутренним кварцем 
CLK->SWCR |= CLK_SWCR_SWEN; // Разрешаем переключение генераторов;
CLK->SWR = 0x01; //Выбираем clock от кварцевого генератора (HSI)
CLK->CKDIVR = CLK_CKDIVR; //Делители частоты на 1 - частота ядра максимальная.
while(CLK_SCSR!=0x01); //Ждем стабилизации частоты   
  
CLK->PCKENR1 |= CLK_PCKENR1_USART1;

USART1->CR1 = 0;
USART1->CR3 = 0;
USART1->CR4 = 0;
USART1->CR5 = 0;
USART1->CR2 = USART_CR2_TEN;

USART1->BRR2 = 0x03;
USART1->BRR1 = 0x68;
int i=1;
while (i==1) {
   USART1->DR = 0xAB;
   while(!(USART1->SR & USART_SR_TC));
}
}
Может кто-нибудь подскажет, что я не учел? Заранее благодарен.
Реклама
brutal
Открыл глаза
Сообщения: 47
Зарегистрирован: Вс июн 10, 2012 22:43:19
Откуда: РФ, г. Курск

Re: STM8l151 USART

Сообщение brutal »

Попробуйте в регистре CR3 установить 3й бит в единицу (CLKEN).
Tais sa gueule et écoute un silence
Реклама
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM8l151 USART

Сообщение HHIMERA »

А это ещё зачем???
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM8l151 USART

Сообщение HHIMERA »

Jem_Jem писал(а): Пытаясь бесконечно подать на выход USART одну и ту же величину использовал такой код:

Код: Выделить всё

#define STM8L15X_MD
#include "iostm8l152c6.h"
#include "stm8l15x.h"

void  main(){

     PC_DDR_bit.DDR3=1; //PС3 - на вывод.
     PD_CR1_bit.C13 = 1;   // Выход типа Push-pull                                      // Почему PD а не PC ????????
     PD_CR2_bit.C23 = 1;                                                                // Почему PD а не PC ????????

  
//CLK->ICKCR |= CLK_ICKCR_HSION;                                                     // Это всё лишнее!!!!!!
//CLK_ICKCR_HSION=1; // Разрешаем работу генератора с внутренним кварцем 
//CLK->SWCR |= CLK_SWCR_SWEN; // Разрешаем переключение генераторов;
//CLK->SWR = 0x01; //Выбираем clock от кварцевого генератора (HSI)
CLK->CKDIVR = CLK_CKDIVR; //Делители частоты на 1 - частота ядра максимальная.    // Здесь просто написать CLK->CKDIVR = 0;
//while(CLK_SCSR!=0x01); //Ждем стабилизации частоты   
  
CLK->PCKENR1 |= CLK_PCKENR1_USART1;

USART1->CR1 = 0;
USART1->CR3 = 0;
USART1->CR4 = 0;
USART1->CR5 = 0;
USART1->CR2 = USART_CR2_TEN;

USART1->BRR2 = 0x03;          // Писать хоть для себя нужно, что это скорость UART 9600 
USART1->BRR1 = 0x68;
int i=1;                              // Не имеет смысла
while (i==1) {                        // Просто while (1)
   USART1->DR = 0xAB;
   while(!(USART1->SR & USART_SR_TC));
}
}
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Эиком - электронные компоненты и радиодетали
Jem_Jem
Родился
Сообщения: 18
Зарегистрирован: Пт май 17, 2013 21:52:00

Re: STM8l151 USART

Сообщение Jem_Jem »

Большое спасибо! Помогло правильное указание порта PC3 и CR3 =1 !
Реклама
Ruslan-maniak
Открыл глаза
Сообщения: 40
Зарегистрирован: Вт янв 18, 2011 08:15:32

Re: STM8l151 USART

Сообщение Ruslan-maniak »

Здравствуйте. Пытаюсь запустить УАРТ на STM8L. И ничего не выходит. Алгоритм следующий:
1) Настраиваю порты

Код: Выделить всё

    PC_DDR_bit.DDR3 = 1;        
    PC_CR1_bit.C13 = 1;       
    PC_CR2_bit.C23 = 0;
    
    PC_DDR_bit.DDR2 = 0;        
    PC_CR1_bit.C12 = 1;        
    PC_CR2_bit.C22 = 1;         
2)Настраиваю УАРТ

Код: Выделить всё

    CLK_PCKENR1_bit.PCKEN15 = 1;        //Тактирование УАРТА    
    
    USART1_CR1 = 0;
    USART1_CR2 = 0;   
    USART1_CR3 = 0;
    USART1_CR4 = 0;
    USART1_CR5 = 0;
    USART1_CR2_bit.TEN = 1;
    //USART1_CR2_bit.TIEN = 1;
    
    USART1_BRR2 = (unsigned char) (((divider >> 8) & 0xF0) | (divider & 0x0F));
    USART1_BRR1 = (unsigned char) (divider >> 4);   
При этом флаги TC и TXE изначально выставлены в единицу. И обнулить их я никак не могу. TXE при записи в DR (При просмотре регистров в DR также остаётся пустым) не обнуляется. А следовательно чтением SR и записью DR, TC также не обнуляется. Напрямую обнулить ТС также не получается (компилятор выдаёт ошибку Error[Pe137]: expression must be a modifiable lvalue - как я понял он считает этот регистор только для чтения, хотя в реф.мане написано что обнулять можно таким образом). Вот и получается что у меня данные в сдвиговый регистр не поступают, но при этом флаг завершения передачи всегда выставлен. Что я делаю не так? Почему не работает УАРТ?
Реклама
Ответить

Вернуться в «Разные вопросы по МК»