2021-02-24 06:58 PM
/**
******************************************************************************
* @file 01_Transmitter/main.c
* @author MCD Application Team
* @version V1.2.0
* @date 19-June-2015
* @brief This code example shows how to configure the GPIOs and USART1
* in order to send bytes.
*
===============================================================================
##### MCU Resources #####
===============================================================================
- RCC
- GPIO PA9(USART1_TX),PA10(USART1_RX),PA0,PC8,PC9
- USART1
- EXTI
===============================================================================
##### How to use this example #####
===============================================================================
- this file must be inserted in a project containing the following files :
o system_stm32f0xx.c, startup_stm32f072xb.s
o stm32f0xx.h to get the register definitions
o CMSIS files
===============================================================================
##### How to test this example #####
===============================================================================
- Plug cable " USB to TTL 3V3 " (from FTDIChip), to PA9 and PA10.
- Launch serial communication SW on PC
- Launch the program
- Press the user button
- "ST" is transmit to PC
- The green LED should toggle if everything goes well
(transmit request)
*
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"
/** @addtogroup STM32F0_Snippets
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
uint8_t send = 0;
const uint8_t stringtosend[] = "ST\n";
/* Private function prototypes -----------------------------------------------*/
void Configure_GPIO_LED(void);
void Configure_GPIO_USART1(void);
void Configure_USART1(void);
void Configure_GPIO_Button(void);
void Configure_EXTI(void);
/* Private functions ---------------------------------------------------------*/
/**
* @brief Main program.
* @param None
* @retval None
*/
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_stm32f072xb.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;
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
/* 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);
GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER2 )) \
| (GPIO_MODER_MODER2_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) */
}
/**
* @brief This function :
- Enables GPIO clock
- Configures the Push Button GPIO PA0
* @param None
* @retval None
*/
__INLINE void Configure_GPIO_Button(void)
{
/* Enable the peripheral clock of GPIOA */
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
/* Select mode */
/* Select input mode (00) on PA0 */
GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER0));
;
}
/**
* @brief This function configures EXTI.
* @param None
* @retval None
*/
__INLINE void Configure_EXTI(void)
{
/* Configure Syscfg, exti and nvic for pushbutton PA0 */
/* (1) PA0 as source input */
/* (2) unmask port 0 */
/* (3) Rising edge */
/* (4) Set priority */
/* (5) Enable EXTI0_1_IRQn */
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
SYSCFG->EXTICR[0] = (SYSCFG->EXTICR[0] & ~SYSCFG_EXTICR1_EXTI0) | SYSCFG_EXTICR1_EXTI0_PA; /* (1) */
EXTI->IMR |= EXTI_IMR_MR0; /* (2) */
EXTI->RTSR |= EXTI_RTSR_TR0; /* (3) */
NVIC_SetPriority(EXTI0_1_IRQn, 0); /* (4) */
NVIC_EnableIRQ(EXTI0_1_IRQn); /* (5) */
//}
/******************************************************************************/
/* Cortex-M0 Processor Exceptions Handlers */
/******************************************************************************/
/**
* @brief This function handles NMI exception.
* @param None
* @retval None
*/
void NMI_Handler(void)
{
}
/**
* @brief This function handles Hard Fault exception.
* @param None
* @retval None
*/
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
/**
* @brief This function handles SVCall exception.
* @param None
* @retval None
*/
void SVC_Handler(void)
{
}
/**
* @brief This function handles PendSVC exception.
* @param None
* @retval None
*/
void PendSV_Handler(void)
{
}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
}
/**
* @brief This function handles EXTI 0 1 interrupt request.
* @param None
* @retval None
*/
void EXTI0_1_IRQHandler(void)
{
EXTI->PR |= 1;
/* start USART transmission */
USART1->TDR = stringtosend[send++]; /* Will inititiate TC if TXE */
}
/**
* @brief This function handles USART1 interrupt request.
* @param None
* @retval None
*/
void USART1_IRQHandler(void)
{
if((USART1->ISR & USART_ISR_TC) == USART_ISR_TC)
{
if(send == sizeof(stringtosend))
{
send=0;
USART1->ICR |= USART_ICR_TCCF; /* Clear transfer complete flag */
GPIOC->ODR ^= GPIO_ODR_8 ; /* Toggle Green LED */
//GPIOB->ODR ^= (1<<2) ;
}
else
{
/* clear transfer complete flag and fill TDR with a new char */
USART1->TDR = stringtosend[send++];
// GPIOB->ODR ^= (1<<2) ;
}
}
else
{
NVIC_DisableIRQ(USART1_IRQn); /* Disable USART1_IRQn */
}
}
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
2021-02-25 12:08 AM
The basic (polling) pattern for sending at register level is
while( !(USART1->ISR & USART_ISR_TXE) ); // wait for TXE flag being set (TDR available)
USART1->TDR = '*'; // send 1 char
the basic (polling) pattern for receiving is:
while( !(USART2->ISR & USART_ISR_RXNE) ); // wait for RXNE flag (RDR not empty) being set
char c = 0xFF & USART2->RDR;
Check the reference manual for the flags and registers
Good luck
KnarfB
2021-02-25 12:08 AM
What are the symptoms?
Try to single-step through program in debugger and observe the relevant registers. Place breakpoints into the interrupts and check if they work as expected.
JW
2021-02-25 01:04 AM
Do you really mean RS232 - ie, with +/-12V signal levels?
If so, do you have a proper RS232 transceiver (sometimes called "level shifter") in place?
2021-02-25 01:08 AM
Sorry!!
I want to change my button to PA8 and return "HELLO" from my computer,
where should I change it?
please
2021-02-25 01:15 AM
You should understand the code you have posted. Then, it will become very clear to you what to change.