Jump to content

    

Инициализация и работа с USART1

Добрый день форумчане

Работаю в CoIDE Пытаюсь передать данные по USARTX Пока ничего не получается в чем проблема

 

#include "misc.h"
#include "stm32l_Init.h"
#include "stm32l1xx_rcc.h"
#include "stm32l1xx_gpio.h"
#include "stm32l1xx_usart.h"

void RCC_Configuration(){
	RCC_HSICmd(ENABLE);
	while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)==RESET);
	RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
	RCC_MSIRangeConfig(RCC_MSIRange_6);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC, ENABLE);

	  /* My Reset USART1, USART3 */
	  USART_DeInit(USART1);
	  USART_DeInit(USART3);

	  /* My Enable clocks USART3 PB10 -> USART3_TX, PB11 -> USART3_RX */
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

	  /* Enable PWR, USART3 mngt clocks */
	   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_USART3, ENABLE);//RCC_APB1Periph_COMP |
	  /* Enable ADC & SYSCFG clocks */
	   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG , ENABLE);
}

void Alt_GPIO_Init(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin){

	/* Initialize Leds mounted on STM32L1-DISCOVERY board */
	 GPIO_InitTypeDef GPIO_InitStructure;

	/* GPIOB Periph clock enable */
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

	/* Configure Port in output pushpull mode */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOx, &GPIO_InitStructure);

}

/****************----------------------------------------------------*******************/
 void Alt_UsartInit(USART_TypeDef* USARTx, GPIO_TypeDef* GPIOx, uint32_t GPIO_Pins, uint32_t BaudRate)
 {
 /* Конфигурируем порты PB10 - TX, PA11- RX как альтернативную функцию для USART3 */
 USART_InitTypeDef USART_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;

	/* Configure USART3 Rx (PB10 PB11) as input floating */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pins;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
	 GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;

	 GPIO_Init(GPIOx, &GPIO_InitStructure);

	 GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3);
	 GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3);

 /* Настраиваем USARTx */
 USART_InitStructure.USART_BaudRate            = BaudRate;
 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;
 /* Включаем USARTx */
 USART_Init(USARTx, &USART_InitStructure);

 /* Включаем USARTx */
	 USART_Cmd(USARTx, ENABLE);
 }
#include "stm32l1xx.h"
#include "stm32l1xx_rcc.h"
#include "stm32l1xx_gpio.h"
#include "stm32l1xx_usart.h"
#include "stm32l_Init.h"

/* Private define ------------------------------------------------------------*/
#define LD_GREEN_GPIO_PIN 		GPIO_Pin_7
#define LD_BLUE_GPIO_PIN        GPIO_Pin_6
/* Private functions ---------------------------------------------------------*/

void Delay(__IO uint32_t nCount);

int main(void)
{
	RCC_Configuration();
	 Alt_GPIO_Init(GPIOB, LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN);
	 	 Alt_UsartInit(USART3, GPIOB, GPIO_Pin_10 | GPIO_Pin_11, 9600);

    while(1)
    {
		GPIO_SetBits(GPIOB, LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN);
		Delay(10000);
		GPIO_ResetBits(GPIOB, LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN);
		Delay(10000);
		USART_SendData(USART3, 's');
        while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);//
      }
    return 0;
}

Ожидает выход со строки

        while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);//

 

Edited by csm7

Share this post


Link to post
Share on other sites

Где-то ошибка:

24 minutes ago, csm7 said:

Пытаюсь передать данные по USART1

А передаете байт в USART3

24 minutes ago, csm7 said:

USART_SendData(USART3, 's');
while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);/

Share this post


Link to post
Share on other sites

Я пробовал и в USART1 и в USART3 передавать Ничего нет на выходе точнее не могу выйти со строки

while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);

 

Share this post


Link to post
Share on other sites

Советы:

- указывать название чипа. То, что это STM32L1xx, местные ясновидящие уже в курсе, но хотелось бы видеть это явно.

- указывать содержимое регистров. Благо у усарта их 3 штуки для управления, 1 для прескалера и 1 статусный.

- у SPL (как, впрочем, и у HAL) есть неприятная особенность. В языке си простое объявление структуры не гарантирует того, что поля её будут осмысленно инициализированы (более того, гарантирует, что это НЕ произойдёт, и там будет мусор). И если пользователь а) не заполнил вручную все поля и б) отключил отладочный макрос assert_param(), эта фигня обязательно стрельнет.

Share this post


Link to post
Share on other sites

Попробуйте инициализировать так:

typedef struct
{
	GPIO_TypeDef      *GPIO;
	unsigned short int Pin;
	unsigned short int PinSource;
}TGPIOBind;

static void HW_ConsoleInit(void)
{
	TGPIOBind GPIO_UART_RX = {GPIOB, GPIO_Pin_11, 11};
	TGPIOBind GPIO_UART_TX = {GPIOB, GPIO_Pin_10, 10};
  
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
	
	GPIO_PinAFConfig(GPIO_UART_RX.GPIO, GPIO_UART_RX.PinSource, GPIO_AF_USART3);
	GPIO_PinAFConfig(GPIO_UART_TX.GPIO, GPIO_UART_TX.PinSource, GPIO_AF_USART3);
	
	GPIO_InitTypeDef GPIO_Configure;
	
	GPIO_Configure.GPIO_Mode  = GPIO_Mode_AF;
	GPIO_Configure.GPIO_OType = GPIO_OType_PP;
	GPIO_Configure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
	GPIO_Configure.GPIO_Speed = GPIO_Speed_100MHz;
	
	GPIO_Configure.GPIO_Pin = GPIO_UART_RX.Pin;
	GPIO_Init(GPIO_UART_RX.GPIO, &GPIO_Configure);
	
	GPIO_Configure.GPIO_Pin = GPIO_UART_TX.Pin;
	GPIO_Init(GPIO_UART_TX.GPIO, &GPIO_Configure);
	
 	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  
	USART_InitTypeDef UART_Configure;
	
	UART_Configure.USART_BaudRate            = 9600;
	UART_Configure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	UART_Configure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
	UART_Configure.USART_Parity              = USART_Parity_No;
	UART_Configure.USART_StopBits            = USART_StopBits_1;
	UART_Configure.USART_WordLength          = USART_WordLength_8b;
	USART_Init(USART3, &UART_Configure);
	
	USART_Cmd(USART3, ENABLE);
	
	return;
}

Если все хорошо - смотрите, в чем различие.

Share this post


Link to post
Share on other sites
22 часа назад, csm7 сказал:

Ожидает выход со строки

        while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);//

У вас не работает передатчик UART - либо он выключен, либо не поступает частота.

В отладчике проверить правильность выставленных битов регистров UART.

 

Share this post


Link to post
Share on other sites
Just now, csm7 said:

Не помогло

Отладчик что говорит? Регистры какие? Регистры включения периферийных частот (тот, где установился флаг RCC_APB1Periph_USART3) в итоге правильный? SPL под этот камень?

Кстати, добавьте включение AFIO перед настройкой альтернативных функций GPIO:

static void HW_ConsoleInit(void)
{
	TGPIOBind GPIO_UART_RX = {GPIOB, GPIO_Pin_11, 11};
	TGPIOBind GPIO_UART_TX = {GPIOB, GPIO_Pin_10, 10};
  	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  	...
}

В младших контроллерах совершенно идиотская система переназначения GPIO, в ней AFIO сделан отдельной субстанцией. В старших такого барахла, к счастью, нет.

Edited by Arlleex

Share this post


Link to post
Share on other sites
2 hours ago, Arlleex said:

В старших такого барахла, к счастью, нет.

В stm32l1xx тоже нет AFIO

IMXO, в коде ничего криминального нет. UART3 настроен, клоки включены, пины настроены, клоки пинов включены.
Но висеть здесь while(USART_GetFlagStatus(USART3, USART_FLAG_TXE), как было сказано выше, может в случае если не включен сам уарт(но в коде есть USART_Cmd(USARTx, ENABLE);) либо если переферия не тактируется(но в коде есть RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_USART3, ENABLE);).
Тому может быть несколько обьяснений:
1. Приведенный для нас код, отличается от вашего
2. SPL библиотеки были модифицированны и не выполняют соответствующие функции
3. Вроде бы такого нет в CoCoox, но возможно, Вы отлаживаетесь на каком-то симуляторе
4. Ошибочное определение места проблемы while(USART_GetFlagStatus(USART3, USART_FLAG_TXE), возможно, из-за использования оптимизации Вы видите не корректное соответствие кода. Оптимизация включена?
5. Системная проблема с клоками или питанием если это конечно кастомная плата, а не дискавери.
6. Или последнее, моя не внимательность, и в коде реально есть проблема :)

Share this post


Link to post
Share on other sites

Код идентичен

По вопросу библиотек не уверен но я туда не лазил

Отлаживаю в CoIDE

Оптимизацию отключил

Плата stm32l-Discovery

 

Share this post


Link to post
Share on other sites

Если отладка, то может быть вы смотрите на UART3->DR? Тогда отладчик этим чтением сбрасывает флаги.

Share this post


Link to post
Share on other sites
6 minutes ago, AHTOXA said:

Тогда отладчик этим чтением сбрасывает флаги.

TXE таким образом испортить не получится :-)

Share this post


Link to post
Share on other sites
On 11/5/2018 at 1:22 PM, csm7 said:

Добрый день форумчане

Работаю в CoIDE Пытаюсь передать данные по USARTX Пока ничего не получается в чем проблема

 

У Вас знаков препинания на клавиатуре нет? Или в школе не проходили?

Share this post


Link to post
Share on other sites

Если есть возможность, скиньте сюда скрин значений регистров после инициализации для следующих модулей:

1) GPIOB;

2) RCC->APB1ENR;

3) USART3.

Кстати: на отладочной плате выводы PB10 и PB11 подключены к дисплею. Не могут ли влиять и тянуть ноги МК вниз? Потому как, могу предположить, что контроллер, видя, что ножка Tx внизу, думает, что передача не закончена... Попробуйте с другими ножками (они для USART3 на других GPIO тоже доступны). На край - другой модуль USART. Чудес не бывает, все-таки.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this