Страница 1 из 1

STM8l151 USART

Добавлено: Вт май 28, 2013 14:21:02
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));
}
}
Может кто-нибудь подскажет, что я не учел? Заранее благодарен.

Re: STM8l151 USART

Добавлено: Вт май 28, 2013 21:08:27
brutal
Попробуйте в регистре CR3 установить 3й бит в единицу (CLKEN).

Re: STM8l151 USART

Добавлено: Ср май 29, 2013 10:20:10
HHIMERA
А это ещё зачем???

Re: STM8l151 USART

Добавлено: Ср май 29, 2013 10:34:47
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));
}
}

Re: STM8l151 USART

Добавлено: Ср май 29, 2013 15:58:33
Jem_Jem
Большое спасибо! Помогло правильное указание порта PC3 и CR3 =1 !

Re: STM8l151 USART

Добавлено: Пн июл 08, 2013 08:24:39
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 - как я понял он считает этот регистор только для чтения, хотя в реф.мане написано что обнулять можно таким образом). Вот и получается что у меня данные в сдвиговый регистр не поступают, но при этом флаг завершения передачи всегда выставлен. Что я делаю не так? Почему не работает УАРТ?