Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с серийным портом в STM32F103RET
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ArtemG
Здравствуйте.
Недавно начал изучать указанную в заголовке плату, и столкнулся с проблемой, которую не могу разрешить.
Есть программа, цель ее - простейшая. При получении данных, отправленных с гипертерминала на плату, нужно зажечь лампочку. Программу писал по руководствам из различных блогов, время от времени заглядывая в руководство; тем не менее она не работает. Бит USART_FLAG_RXNE постоянно пребывает в состоянии RESET, при этом осциллограф показывает, что данные на RX идут. Если пытаюсь решить похожую задачу - отправить данные с платы на гипертерминал через все тот же серийный порт, данные проходят нормально. Если у кого-нибудь есть догадки, что может быть не так - подскажите, пожалуйста. Бьюсь третий день и пока безрезультатно.sm.gif
CODE
/* Includes ------------------------------------------------------------------*/
#include <intrinsics.h>
#include "stm32f10x_lib.h"

volatile unsigned int LedState = 0; // LED is ON when corresponding bit is 1.

void LEDsSet(unsigned int State, unsigned int GPIO_Pin_XX);

void SetupClock()
{
RCC_DeInit (); /* RCC system reset(for debug purpose)*/
RCC_HSEConfig (RCC_HSE_ON); /* Enable HSE */

/* Wait till HSE is ready */
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);

RCC_HCLKConfig (RCC_SYSCLK_Div1); /* HCLK = SYSCLK */
RCC_PCLK2Config (RCC_HCLK_Div1); /* PCLK2 = HCLK */
RCC_PCLK1Config (RCC_HCLK_Div2); /* PCLK1 = HCLK/2 */
RCC_ADCCLKConfig (RCC_PCLK2_Div4); /* ADCCLK = PCLK2/4 */

/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig (RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

RCC_PLLCmd (ENABLE); /* Enable PLL */

/* Wait till PLL is ready */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

/* Select PLL as system clock source */
RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);

/* Wait till PLL is used as system clock source */
while (RCC_GetSYSCLKSource() != 0x08);

/* Enable USART1 and GPIOA clock */
RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

}

void LEDsSet(unsigned int State, unsigned int GPIO_Pin_XX)
{
GPIO_WriteBit(GPIOA,GPIO_Pin_XX,State?Bit_SET:Bit_RESET);
}

void delay(u32 shift)
{
u32 i = 0;
for(i = shift; i != 0; i--);
}

void main(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

#ifdef DEBUG
debug();
#endif
SetupClock();

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_Init(GPIOA, &GPIO_InitStructure);


/* Configure the GPIO ports( USART1 Transmit and Receive Lines) */
/* Configure the USART1_Tx as Alternate function Push-Pull */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure the USART1_Rx as input floating */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);


/* USART1 configuration ------------------------------------------------------*/
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;

/* Configure the USART1 */
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);

// USART Init.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);

do
{
if((USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET))
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
u16 data = USART_ReceiveData(USART1);
LEDsSet(1,GPIO_Pin_4);
}

}while(1);

}
#ifdef DEBUG
void assert_failed(u8* file, u32 line)
{
while(1);
}
#endif
smk
А вручную настроить USART, прописать регистры непосредственно, без библиотечных функций не пробовали? Сделать простенькую программку чтобы отправляла один байт и в терминале смотреть?
=F8=
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE); Нужно вызывать ДО конфигурации соотв перефирии.
Не забываем вызывать:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, DISABLE);
по крайней мере последнюю, которая DISABLE. Тоже ДО конфигурации после RCC_APB2PeriphClockCmd.
PS Скачайте FreeRTOS там есть примеры.
sevastianovd
USART_ClearITPendingBit(USART1, USART_IT_RXNE); - здесь лишнее, прерывания вы не используете

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE); 0 у вас уже выполняется в SetupClock(), так что из main() ее уберите,
=f8=,
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, DISABLE);
никогда не вызывал, и вызывать не планирую
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.