USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* Enable GPIO A for USART2 Rx,Tx Pins */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /* Enable USART2 Clock */ /* Configure USART2 Tx (PA.02) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART2 Rx (PA.03) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 38400; 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(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); /* Enable the USART */ .. See your other thread for string output code using the FW library void send_string(const char *s) { while(*s) { while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); USART_SendData(USART2, *s++); } } |
Страницы
▼
Страницы
▼
четверг, 28 ноября 2013 г.
Example USART from FW library
Перенаправление printf() в C для STM32
В целях вывода отладочной информации при использовании Debug не в пошаговом режиме удобно выводить текущие значения переменных с помощью стандартной функции C printf(). Для этого в проект добавляем кроме стандартных файлов startup_stm32f10x_md.s и system_stm32f10x.c создаем файл retarget.c листинг которого представлен ниже и подключаем его в проект
#include <stdio.h>
#include <stm32f10x.h>
#pragma import(__use_no_semihosting_swi)
#define ECHO_FGETC
volatile int ITM_RxBuffer=0x5AA55AA5; /* Buffer to transmit data towards debug system. */
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
return (ITM_SendChar((uint32_t)ch));
}
unsigned char backspace_called;
unsigned char last_char_read;
int r;
int fgetc(FILE *f)
{
/* if we just backspaced, then return the backspaced character */
/* otherwise output the next character in the stream */
if (backspace_called == 1)
{
backspace_called = 0;
}
else {
do {
r = ITM_ReceiveChar();
} while (r == -1);
last_char_read = (unsigned char)r;
#ifdef ECHO_FGETC
ITM_SendChar(r);
#endif
}
return last_char_read;
}
/*
** The effect of __backspace() should be to return the last character
** read from the stream, such that a subsequent fgetc() will
** return the same character again.
*/
int __backspace(FILE *f)
{
backspace_called = 1;
return 0;
}
int ferror(FILE *f) {
/* Your implementation of ferror */
return EOF;
}
void _ttywrch(int ch) {
ITM_SendChar((uint32_t)ch);
}
void _sys_exit(int return_code) {
while (1); /* endless loop */
}
По материалам из
#include <stdio.h>
#include <stm32f10x.h>
#pragma import(__use_no_semihosting_swi)
#define ECHO_FGETC
volatile int ITM_RxBuffer=0x5AA55AA5; /* Buffer to transmit data towards debug system. */
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
return (ITM_SendChar((uint32_t)ch));
}
unsigned char backspace_called;
unsigned char last_char_read;
int r;
int fgetc(FILE *f)
{
/* if we just backspaced, then return the backspaced character */
/* otherwise output the next character in the stream */
if (backspace_called == 1)
{
backspace_called = 0;
}
else {
do {
r = ITM_ReceiveChar();
} while (r == -1);
last_char_read = (unsigned char)r;
#ifdef ECHO_FGETC
ITM_SendChar(r);
#endif
}
return last_char_read;
}
/*
** The effect of __backspace() should be to return the last character
** read from the stream, such that a subsequent fgetc() will
** return the same character again.
*/
int __backspace(FILE *f)
{
backspace_called = 1;
return 0;
}
int ferror(FILE *f) {
/* Your implementation of ferror */
return EOF;
}
void _ttywrch(int ch) {
ITM_SendChar((uint32_t)ch);
}
void _sys_exit(int return_code) {
while (1); /* endless loop */
}
создаем файл main.c для демонстрации работы функции printf()
#include "stdio.h"
//#include <stm32f10x.h> // Required by CMSIS
int main(void) {
int j = 0;
unsigned char i =0;
while (1) {
j++;
if (j==1000000) {
j = 0;
if (i==0xFF) i = 0;
printf("Value of i: %d\n", i);
i++;
}
}
}
Запускаем Debugger и выбираем View -> Serial Windows-> Debug printf() Viever. После запуска программы на выполнение, наблюдаем вывод в окне Debug printf() Viever
По материалам из
среда, 27 ноября 2013 г.
Конфигурирование USART
int main(void){ /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file */ Configure_GPIO_LED(); Configure_GPIO_USART1(); Configure_USART1(); Configure_GPIO_Button(); Configure_EXTI(); /* Start transmission in button IRQ handler */ /* Infinite loop */ while (1) { }}/** * @brief This function : - Enables GPIO clock - Configures the Green LED pin on GPIO PC9 - Configures the Orange LED pin on GPIO PC8 * @param None * @retval None */__INLINE void Configure_GPIO_LED(void){ /* Enable the peripheral clock of GPIOC */ RCC->AHBENR |= RCC_AHBENR_GPIOCEN; /* Select output mode (01) on PC8 and PC9 */ GPIOC->MODER = (GPIOC->MODER & ~(GPIO_MODER_MODER8 | GPIO_MODER_MODER9)) \ | (GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0);}/** * @brief This function : - Enables GPIO clock - Configures the USART1 pins on GPIO PB6 PB7 * @param None * @retval None */__INLINE void Configure_GPIO_USART1(void){ /* Enable the peripheral clock of GPIOA */ RCC->AHBENR |= RCC_AHBENR_GPIOAEN; /* GPIO configuration for USART1 signals */ /* (1) Select AF mode (10) on PA9 and PA10 */ /* (2) AF1 for USART1 signals */ GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER9|GPIO_MODER_MODER10))\ | (GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1); /* (1) */ GPIOA->AFR[1] = (GPIOA->AFR[1] &~ (GPIO_AFRH_AFRH1 | GPIO_AFRH_AFRH2))\ | (1 << (1 * 4)) | (1 << (2 * 4)); /* (2) */}/** * @brief This function configures USART1. * @param None * @retval None */__INLINE void Configure_USART1(void){ /* Enable the peripheral clock USART1 */ RCC->APB2ENR |= RCC_APB2ENR_USART1EN; /* Configure USART1 */ /* (1) oversampling by 16, 9600 baud */ /* (2) 8 data bit, 1 start bit, 1 stop bit, no parity */ USART1->BRR = 480000 / 96; /* (1) */ USART1->CR1 = USART_CR1_TE | USART_CR1_UE; /* (2) */ /* polling idle frame Transmission */ while((USART1->ISR & USART_ISR_TC) != USART_ISR_TC) { /* add time out here for a robust application */ } USART1->ICR |= USART_ICR_TCCF;/* clear TC flag */ USART1->CR1 |= USART_CR1_TCIE;/* enable TC interrupt */ /* Configure IT */ /* (3) Set priority for USART1_IRQn */ /* (4) Enable USART1_IRQn */ NVIC_SetPriority(USART1_IRQn, 0); /* (3) */ NVIC_EnableIRQ(USART1_IRQn); /* (4) */}