ftp27

Stm8L И Uart

4 сообщения в этой теме

ftp27    2

Пытаюсь завести UART на сабжевом микроконтроллере. В принципе таки все есть, но UART упорно молчит при передаче и не выходит на прерывание при приеме. Чутье подсказывает, что я просто напросто не так подал тактирование на модуль USART, но уже раз 10 все перепроверил. Все именно так.

Вот код:

#include "iostm8l152c6.h"
int main ( void )
{
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;

//UART init
CLK_PCKENR1_bit.PCKEN15 = 1;

USART1_CR1 = 0;
USART1_CR3 = 0;
USART1_CR4 = 0;
USART1_CR5 = 0;

USART1_BRR2 = 0x03;
USART1_BRR1 = 0x68;

USART1_CR2_bit.RIEN = 1;
USART1_CR2_bit.REN = 1;
USART1_CR2_bit.TEN = 1;

asm("RIM");

while (1) { //Loop
while(!(USART1_SR_bit.TC));
USART1_DR = '!';
}

return 0;
}
#pragma vector=USART_R_OR_vector
__interrupt void USART_RXNE(void)
{
while(!(USART1_SR_bit.TC));
USART1_DR = '?';
}

По поводу железа... Передачу (TX со стороны STM) я жду на лапе PC3, а прием (RX) на PC2

Изменено пользователем ftp27

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ftp27    2

Да. Ошибка была моя. Не настроил проект для прошивки по ST-Link. Но возникла другая трабла. Если верить длине бита взятых с осциллографа и формуле подсчета BRR из даташита (Скорость = Генератор/BBR), то частота тактирования USART - 32Мгц, что просто не может быть (16Мгц же). К тому же в пакете не отсылается последний бит. При передаче передается 7 бит вместо 8.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ftp27    2

Решение:

настройка резонатора

CLK_CKDIVR = 0;
CLK_ICKCR_bit.HSION = 1;

BBR

USART1_BRR2 = 0x03;
USART1_BRR1 = 0x68;

Пиздатые тут у вас помошники....

  • Не одобряю 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: LoKeR
      Доброго времени суток, нашел хорошую статью Usart прием и отправка строки. Настроил на порт Usart3 перестал работать, попробовал на Usart2 перекинуть тоже не работает, как правильно переделать подскажите...
      stm32-uart-spl.rar
    • Автор: Евгений61
      Здравствуйте! Помогите пожалуйста разобраться с заголовочным файлом.
      По идее pragma vector должен быть прописан в IOSTM8s003f3.h
      но там почему то не прописаны аектора внешних прерываний. Помогите!
      И еще вопросик. Как посмотреть что описано в "#define" файле. Может его можно самому написать.


      А В ДАТАШИТЕ ВЕКТОРА ЕСТЬ
       

    • Автор: Евгений61
      Здравствуйте. Такой вопрос. Нужно реализовать на STM8S командное управление. 
      Поясню. При поступлении восьмибитного кода на пин МК нужно выполнять какое то действие. Кодировка кода происходит ШИМ модуляцией( Т,Е. по длительности импульса- длинный импульс =1 короткий =0.). При нарастании фронта на ножку МК нужно включить таймер. По спаду фронта нужно выключить таймер, и сравнить значение счетчика с числом. Если значение совпадает, то записать число (0 или 1) в соответствующий бит регистра. По принятии всех 8 битов нужно выполнять какое-то действие. Так вот вопрос заключается в том-как реализовать запуск таймера при поступлении на ножку фронта сигнала, и как его остановить по спаду и проверить значение счетчика. Желательно делать аппаратно на таймерах и прерываниях, что бы уменьшить время.

    • Автор: Тимур1992
      Доброго времени суток.
      Решил пробудить свои скилы по написанию программ под stm32f103. Поигрался с SMT32CUDEMX и HAL, но вернулся к SLP библиотеке.  Начал постепенно наращивать программу по примерам, начиная с GPIO, тактирования и на работе c USART встал. Суть в том что передача по UART идет нормально, а вот прием приводит к "зависанию". Устанавливая бесконечные while с мигалками внутри, я выяснил что по все видимости МК не переходит в прерывания USART1_IRQHandler. Я не могу понять в чем ошибка, раньше с таким не сталкивался, хотя написал несколько программ для stm32f100 .____.
      Среда разработки Atollic TrusStudio 9.0.0.
       
      #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_usart.h" #include "misc.h" #include <string.h> // тактовый светодиод для индикации #define LED GPIO_Pin_5 #define RX_BUF_SIZE 80 volatile char RX_FLAG_END_LINE = 0; volatile char RXi; volatile char RXc; volatile char RX_BUF[RX_BUF_SIZE] = {'\0'}; volatile char buffer[80] = {'\0'}; void init_GPIO(void); void SetSysClockTo72(void); void init_uart(void); void clear_RXBuffer(void); void USARTSend(const char *pucBuffer); void USART1_IRQHandler(void) { GPIO_ResetBits(GPIOA, LED); //GPIOA->ODR ^= LED; //USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); //if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { //if ((USART1->SR & USART_FLAG_RXNE) != RESET) { //if ((USART1->SR & USART_SR_RXNE) != (u16)RESET) { if (USART1->SR & USART_SR_RXNE) { // Сбрасываем флаг прерывания USART1->SR &=~ USART_SR_RXNE; //RXc = USART_ReceiveData(USART1); //RX_BUF[RXi] = RXc; //RXi++; //if (RXc != 13) { // if (RXi > RX_BUF_SIZE-1) { // clear_RXBuffer(); // } //} //else { // RX_FLAG_END_LINE = 1; //} //Echo //USARTSend("Interrapt_UART1\r\n"); //USART_SendData(USART1, RXc); } //return } int main(void) { int i; //SetSysClockTo72(); init_GPIO(); init_uart(); USARTSend("Test USART1\r\n"); while (1) { //if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9) != 0) { /* Toggle LED which connected to PC13*/ GPIOA->ODR ^= LED; // Invert C13 /* delay */ for(i=0;i<0x100000;i++); /* Toggle LED which connected to PC13*/ GPIOA->ODR ^= LED; /* delay */ for(i=0;i<0x100000;i++); USARTSend("Test USART1\r\n"); //} //else { //GPIO_SetBits(GPIOA, LED); //} } } void init_GPIO(void) { // Создаем класс для постепенной настройки параметров и единовременного применени¤ GPIO_InitTypeDef GPIO_InitStructure; //Настрайваем светодиод, включаем тактирование GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Конфигурация для светодиода, режим работы, максимальная скорость GPIO_InitStructure.GPIO_Pin = LED; // GPIO_Mode_Out_OD выход с открытым стоком, GPIO_Mode_Out_PP выход двумя состояниями // GPIO_Mode_AF_OD выход с открытым стоком для альтернативных функций, GPIO_Mode_AF_PP то же самое, но с двумя состояниями GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // Устанавливаем начальное значение SetBits -> High level ("1"), ResetBits -> Low level ("0") GPIO_ResetBits(GPIOA, LED); // Настрайваем пин 9, регистра B на вход, для отладки, включаем тактирование регистра B RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // Настрайваем для кнопку, пин, режим, максимальная частота входного сигнала GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // GPIO_Mode_AIN аналоговый вход, GPIO_Mode_IN_FLOATING вход без подтяжки, болтающийся // GPIO_Mode_IPD вход с подтяжкой к земле, GPIO_Mode_IPU вход с подтяжкой к питанию GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void SetSysClockTo72(void) { ErrorStatus HSEStartUpStatus; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/ /* Системный RESET RCC (делать не обязательно, но полезно на этапе отладки) */ RCC_DeInit(); /* Включаем HSE (внешний кварц) */ RCC_HSEConfig( RCC_HSE_ON); /* Ждем пока HSE будет готов */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* Если с HSE все в порядке */ if (HSEStartUpStatus == SUCCESS) { /* HCLK = SYSCLK */ /* Смотри на схеме AHB Prescaler. Частота не делится (RCC_SYSCLK_Div1) */ RCC_HCLKConfig( RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ /* Смотри на схеме APB2 Prescaler. Частота не делится (RCC_HCLK_Div1) */ RCC_PCLK2Config( RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ /* Смотри на схеме APB1 Prescaler. Частота делится на 2 (RCC_HCLK_Div2) потому что на выходе APB1 должно быть не более 36МГц (смотри схему) */ RCC_PCLK1Config( RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ /* Указываем PLL от куда брать частоту (RCC_PLLSource_HSE_Div1) и на сколько ее умножать (RCC_PLLMul_9) */ /* PLL может брать частоту с кварца как есть (RCC_PLLSource_HSE_Div1) или поделенную на 2 (RCC_PLLSource_HSE_Div2). Смотри схему */ //RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLConfig(0x00010000, RCC_PLLMul_9); /* Включаем PLL */ RCC_PLLCmd( ENABLE); /* Ждем пока PLL будет готов */ while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Переключаем системное тактирование на PLL */ RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); /* Ждем пока переключиться */ while (RCC_GetSYSCLKSource() != 0x08) { } } else { /* Проблемы с HSE. Тут можно написать свой код, если надо что-то делать когда микроконтроллер не смог перейти на работу с внешним кварцом */ /* Пока тут заглушка - вечный цикл*/ // while (1) { //} } } void init_uart(void) { /* Enable USART1 and GPIOA clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); /* Configure the GPIOs */ GPIO_InitTypeDef GPIO_InitStructure; /* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx (PA.10) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure the USART1 */ USART_InitTypeDef USART_InitStructure; /* USART1 configuration ------------------------------------------------------*/ /* USART1 configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled - USART Clock disabled - USART CPOL: Clock is active low - USART CPHA: Data is captured on the middle - USART LastBit: The clock pulse of the last data bit is not output to the SCLK pin */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); /* Enable USART1 */ USART_Cmd(USART1, ENABLE); /* Enable the USART1 Receive interrupt: this interrupt is generated when the USART1 receive data register is not empty */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* NVIC Configuration */ NVIC_InitTypeDef NVIC_InitStructure; /* Enable the USARTx Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //NVIC_EnableIRQ(USART1_IRQn); } void clear_RXBuffer(void) { for (RXi=0; RXi<RX_BUF_SIZE; RXi++) RX_BUF[RXi] = '\0'; RXi = 0; } void USARTSend(const char *pucBuffer) { while (*pucBuffer) { USART_SendData(USART1, *pucBuffer++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } } }  
    • Автор: Nitro N
      Здравствуйте! 
      Дано: 
      BLE модуль JDY-10 Гироскоп + Акселерометр модуль GY-521  USB UART CH340G USB bluetooth адаптер Цель:
      передавать сигналы датчика гироскопа и акселерометра через bluetooth модуль на ПК. Мои рассуждения:
      Модуль GY-521 имеет I2C интерфейс, на JDY-10 стоит МК CC2541 который тоже имеет I2C интерфейс. Надо как-то их соединить и заставить отправлять показания на ПК. Как это сделать пока мне не понятно. Иногда приходят мысли что без перепрошивки контроллера не обойтись. 

      Подскажите пожалуйста как это реализовать?

      П.С. В идеале вообще конечно использовать один контроллер для снятия значений и отправки на ПК, но пока так. 
  • Сообщения

    • Спасибо! Нет.
        https://ru.aliexpress.com/item/FREE-SHIPPING-IRS27952STRPBF-IRS27952S-S27952-SOP8-5-PCS/32800614396.html?spm=a2g0s.9042311.0.0.3b8d33ednwdhZw
    • А модератору нужно в двойне уважать мнения участников и не пытаться изображать из себя воина света.
    • От 10 ноги OP3 на землю желателен резистор , пусть будет 10k .
    • Я как минимум модератор данного раздела, данного ТЕХНИЧЕСКОГО форума и моя обязанность содержать вверенный мне разделы в исправности, чистить их от оффтопа (в том числе и от антинауного, антитехнического мусора) Все что я говорю, я могу обосновать технически и подкрепить фактами, в противном случае - я просто молчу. 
        Я никого не убеждаю. Тех, кто подобные перлы пишут, переубеждать уже бесполезно. Я все это пишу для сторонних наблюдателей, которые возможно лет через пять зайдут на этот форум и прочитав какое-либо бредовое утверждение, сразу же следом за ним, смогут прочитать подкрепленное фактами и вескими доводами опровержение (один из примеров тому - выше).
        И здесь вам все кажется: все дело в том, что остальные "правые" предпочитают обходить стороной места скопления филов. Они все для себя понимают, просто не хотят вступать в диалог с теми, кого переубеждать бесполезно. Это я один такой - непримиримый. И только поэтому вам кажется что "я такой один против вас всех". Нет, наоборот, здоровых людей гораздо больше, просто филы лучше организованны. У них есть общая болезнь, которая их объединяет...
    • Проверить 220 на линии. Если есть, то подать 220 на мотор. Потом оптопару проверить на предохранитель (подключено параллельно предохранителю, последовательно с мотором), там всегда должен быть ноль. Если там есть переменка - предохранитель в обрыве.
    • @Vlad90  Вот тут выложена схема Владимира65 со стартом от 6В , только без ШИМа .  
    • Конечно, однако с точки зрения логики разработка и тиражирование - это также разные вещи. Вы мне в соседней теме так и не ответили, какой практически полезный девайс могли бы сделать основываясь на вашей теории? Вы и адресок прям по 2ГИСу можете указать или же только номер в центуре?     А расчёт там наличными или только в крипто-КЦ? Кстати, третий день от Кеши тишина, пропал куда-то. Случилось что или он взял мелки для тараканов и тихонько в уголочке мне долгожданную картинку рисует?