1 | #include <stdio.h>
|
2 | #include "stm32l0xx.h"
|
3 |
|
4 | uint32_t SystemCoreClock=2097000;
|
5 |
|
6 | // delay loop for the default 2.1 MHz CPU clock with optimizer enabled
|
7 | void delay(uint32_t msec)
|
8 | {
|
9 | for (uint32_t j=0; j < 419UL * msec; j++)
|
10 | {
|
11 | __NOP();
|
12 | }
|
13 | }
|
14 |
|
15 | // Redirect standard output to the serial port
|
16 | int _write(int file, char *ptr, int len)
|
17 | {
|
18 | for (int i=0; i<len; i++)
|
19 | {
|
20 | while(!(USART1->ISR & USART_ISR_TXE));
|
21 | USART1->TDR = *ptr++;
|
22 | }
|
23 | return len;
|
24 | }
|
25 |
|
26 | // Called after each received character
|
27 | void USART1_IRQHandler(void)
|
28 | {
|
29 | // read the received character
|
30 | char received=USART1->RDR;
|
31 |
|
32 | // send echo back
|
33 | while(!(USART1->ISR & USART_ISR_TXE));
|
34 | USART1->TDR = received;
|
35 | }
|
36 |
|
37 | int main(void)
|
38 | {
|
39 | // Enable clock for Port A
|
40 | SET_BIT(RCC->IOPENR, RCC_IOPENR_GPIOAEN);
|
41 |
|
42 | // PA5 = Output for the LED
|
43 | MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODE5, GPIO_MODER_MODE5_0);
|
44 |
|
45 | // Use system clock for USART1
|
46 | SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);
|
47 | MODIFY_REG(RCC->CCIPR, RCC_CCIPR_USART1SEL, RCC_CCIPR_USART1SEL_0);
|
48 |
|
49 | // PA9 (TxD) shall use the alternate function 4 (see data sheet)
|
50 | MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFSEL9, 4UL<<GPIO_AFRH_AFSEL9_Pos);
|
51 | MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODE9, GPIO_MODER_MODE9_1);
|
52 |
|
53 | // PA10 (RxD) shall use the alternate function 4 (see data sheet)
|
54 | MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFSEL10, 4UL<<GPIO_AFRH_AFSEL10_Pos);
|
55 | MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODE10, GPIO_MODER_MODE10_1);
|
56 |
|
57 | // Set baudrate
|
58 | USART1->BRR = (SystemCoreClock / 2400);
|
59 |
|
60 | // Enable transmitter, receiver and receive-interrupt of USART1
|
61 | USART1->CR1 = USART_CR1_UE + USART_CR1_TE + USART_CR1_RE + USART_CR1_RXNEIE;
|
62 |
|
63 | // Enable interrupt in NVIC
|
64 | NVIC_EnableIRQ(USART1_IRQn);
|
65 |
|
66 | while (1)
|
67 | {
|
68 | // LED on
|
69 | WRITE_REG(GPIOA->BSRR, GPIO_BSRR_BS_5);
|
70 | delay(500);
|
71 |
|
72 | puts("Hello");
|
73 |
|
74 | // LED off
|
75 | WRITE_REG(GPIOA->BSRR, GPIO_BSRR_BR_5);
|
76 | delay(500);
|
77 | }
|
78 | }
|