реклама на сайте
подробности

 
 
> Проблема с серийным портом в STM32F103RET
ArtemG
сообщение Feb 3 2012, 06:55
Сообщение #1





Группа: Новичок
Сообщений: 1
Регистрация: 30-01-12
Пользователь №: 69 955



Здравствуйте.
Недавно начал изучать указанную в заголовке плату, и столкнулся с проблемой, которую не могу разрешить.
Есть программа, цель ее - простейшая. При получении данных, отправленных с гипертерминала на плату, нужно зажечь лампочку. Программу писал по руководствам из различных блогов, время от времени заглядывая в руководство; тем не менее она не работает. Бит 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


Сообщение отредактировал IgorKossak - Feb 3 2012, 08:16
Причина редактирования: [codebox]!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
smk
сообщение Feb 3 2012, 07:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



А вручную настроить USART, прописать регистры непосредственно, без библиотечных функций не пробовали? Сделать простенькую программку чтобы отправляла один байт и в терминале смотреть?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
=F8=
сообщение Feb 3 2012, 07:55
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



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 там есть примеры.
Go to the top of the page
 
+Quote Post
sevastianovd
сообщение Feb 3 2012, 09:26
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 8-04-08
Из: Омск
Пользователь №: 36 562



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);
никогда не вызывал, и вызывать не планирую
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th August 2025 - 17:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.36564 секунд с 7
ELECTRONIX ©2004-2016