Tym razem przedstawię szybki post dotyczący mikrokontrolerów STM32F0 w którym przedstawię podstawowe operacje na portach GPIO w oparciu o mikrokontroler STM32F030P6.
Program dla GPIO
Nie ma tutaj żadnych odkrywczych rzeczy, wobec czego przejdę od razu do kodu:
Rozpocząć należy standardowo od deklaracji bibliotek. Następnie włączenie zegarów oraz inicjalizacja pinów mikrokontrolera:
- #include "stm32f0xx.h"
- #include <stm32f0xx_rcc.h>
- #include <stm32f0xx_gpio.h>
- //===========================================================================================================
- GPIO_InitTypeDef GPIO_Init;
- //===========================================================================================================
- void delay(int a);
- //===========================================================================================================
- int main(void)
- {
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
- GPIO_Init.GPIO_Pin = GPIO_Pin_4;
- GPIO_Init.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_Init.GPIO_OType = GPIO_OType_PP;
- GPIO_Init.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init.GPIO_Speed = GPIO_Speed_Level_1;
- GPIO_Init(GPIOA, &GPIO_Init);
- while(1)
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_4);
- delay(30000);
- GPIO_ResetBits(GPIOA, GPIO_Pin_4);
- delay(30000);
- }
- }
- void delay(int a)
- {
- volatile int i,j;
- for (i=0 ; i < a ; i++) { j++; }
- return;
- }
Układ w obudowie jaką stosuje nie zawiera wiele wyprowadzeń w związku z tym dobrze jest wykorzystywać wewnętrzny oscylator, który włączy się automatycznie. Aby korzystać z pinów od kwarcu to należy wyłączyć wcześniej HSE. Dopiero po tej operacji, można z nich korzystać bez przeszkód.
Program dla UART:
- #include "stm32f0xx.h"
- #include <stm32f0xx_rcc.h>
- #include <stm32f0xx_usart.h>
- #include <stm32f0xx_gpio.h>
- #include <stm32f0xx_tim.h>
- #include <stm32f0xx_exti.h>
- //===========================================================================================================
- #define RCC_USART RCC_APB2Periph_USART1
- #define RCC_GPIOA RCC_AHBPeriph_GPIOA
- #define USART_PIN_SOURCE_1 GPIO_PinSource9
- #define USART_PIN_SOURCE_2 GPIO_PinSource10
- #define PIN_1_USART GPIO_Pin_9
- #define PIN_2_USART GPIO_Pin_10
- #define USART_LINE GPIOA
- #define PIN_1_DIODE GPIO_Pin_4
- #define DIODE_LINE GPIOA
- //===========================================================================================================
- uint8_t buff[20];
- //===========================================================================================================
- USART_InitTypeDef USART_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- //===========================================================================================================
- void init_GPIO_USART(void);
- //===========================================================================================================
- void delay(int a);
- //===========================================================================================================
- void SEND_NUMBER_UART(uint32_t x);
- //===========================================================================================================
- void SendPacket(uint8_t *data, uint16_t length) //Przeslanie ciagu danych
- //===========================================================================================================
- uint32_t Send_Byte(uint8_t c)
- //===========================================================================================================
- int main (void)
- {
- init_GPIO_USART();
- GPIO_SetBits(DIODE_LINE, PIN_1_DIODE);
- Send_Byte('r');
- delay(4000);
- SEND_NUMBER_UART(86);
- while(1) { }
- }
- //===========================================================================================================
- void init_GPIO_USART(void)
- {
- RCC_AHBPeriphClockCmd(RCC_GPIOA, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_USART,ENABLE);
- GPIO_PinAFConfig(USART_LINE, USART_PIN_SOURCE_1, GPIO_AF_1);
- GPIO_PinAFConfig(USART_LINE, USART_PIN_SOURCE_2, GPIO_AF_1);
- GPIO_Init.GPIO_Pin = PIN_1_DIODE;
- GPIO_Init.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_Init.GPIO_OType = GPIO_OType_PP;
- GPIO_Init.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init.GPIO_Speed = GPIO_Speed_Level_1;
- GPIO_Init(DIODE_LINE, & GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = PIN_1_USART | PIN_2_USART;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(USART_LINE, &GPIO_InitStructure);
- 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;
- USART_Init(USART1, &USART_InitStructure);
- USART_Cmd(USART1,ENABLE);
- }
- //===========================================================================================================
- void delay(int a)
- {
- volatile int i,j;
- for (i=0 ; i < a ; i++) { j++; }
- return;
- }
- //===========================================================================================================
- void SEND_NUMBER_UART(uint32_t x)
- {
- char value[10]; //a temp array to hold results of conversion
- int i = 0; //loop index
- do
- {
- value[i++] = (char)(x % 10) + '0'; //convert integer to character
- x /= 10;
- } while(x);
- while(i) //send data
- {
- Send_Byte(value[--i]);
- }
- }
- //===========================================================================================================
- void SendPacket(uint8_t *data, uint16_t length) //Przeslanie ciagu danych
- {
- uint16_t i;
- i = 0;
- while (i < length)
- {
- Send_Byte(data[i]);
- i++;
- }
- }
- //===========================================================================================================
- uint32_t Send_Byte(uint8_t c)
- {
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- USART_SendData(USART1, c);
- return 0;
- }