文章目录
1. GPIO
以LED灯为例
1.1 led.h
#define LED_NUM (3) // LED的数量
typedef enum
{
LED_GREEN = 0,
LED_RED,
LED_BLUE2,
} tLed; // LED的枚举
// RED
#define LED1_GPIO_PIN GPIO_Pin_5
#define LED1_GPIO_PORT GPIOC
#define LED1_GPIO_CLK RCC_AHB1Periph_GPIOC
// GREEN
#define LED2_GPIO_PIN GPIO_Pin_4
#define LED2_GPIO_PORT GPIOC
#define LED2_GPIO_CLK RCC_AHB1Periph_GPIOC
// BLUE
#define LED3_GPIO_CLK GPIO_Pin_6
#define LED3_GPIO_PORT GPIOB
#define LED3_GPIO_CLK RCC_AHB1Periph_GPIOB
#define LED_ON (1)
#define LED_OFF (0)
1.2 led.c
// LED端口号结构体,注意结构体的类型
GPIO_TypeDef* LED_PORT[LED_NUM] = {
LED1_GPIO_PORT,
LED2_GPIO_PORT,
LED3_GPIO_PORT,
};
const uint16_t LED_PIN[LED_NUM] = {
LED1_GPIO_PIN,
LED2_GPIO_PIN,
LED3_GPIO_PIN,
};
const uint32_t LED_CLK[LED_NUM] = {
LED1_GPIO_CLK,
LED2_GPIO_CLK,
LED3_GPIO_CLK,
};
void led_init(tLed led);
void led_on(tLed led)
{
GPIO_WriteBit( LED_PORT[led], LED_PIN[led], LED_ON );
}
void led_off(tLed led);
void led_toggle(tLed led); // LED翻转
void led_flash(tLed led, uint32_t ms, uint8_t count); // LED闪烁,参数2闪烁间隔ms,参数3闪烁次数
2. UART
2.1 uart.h
#define UART_INTERFACE UART1
#define UART_CLK RCC_APB2Periph_UART1
#define UART_RX_PORT GPIOA
#define UART_RX_PORT_CLK RCC_APB2Periph_GPIOA
#define UART_RX_PIN GPIO_Pin_5
#define UART_TX_PORT GPIOB
#define UART_TX_PORT_CLK RCC_APB2Periph_GPIOA
#define UART_TX_PIN GPIO_Pin_6
#define UART_IRQ USART1_IRQn
#define UART_IRQHandler USART1_IRQHandler
2.2 uart.c
void uart_init(void);
/***************** 发送一个字符 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
/* 发送一个字节数据到USART */
USART_SendData(pUSARTx,ch);
/* 等待发送数据寄存器为空 */
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
/***************** 发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
unsigned int k=0;
do
{
Usart_SendByte( pUSARTx, *(str + k) );
k++;
} while(*(str + k)!='\0');
/* 等待发送完成 */
while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
{}
}
/***************** 发送一个16位数 **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{
uint8_t temp_h, temp_l;
/* 取出高八位 */
temp_h = (ch&0XFF00)>>8;
/* 取出低八位 */
temp_l = ch&0XFF;
/* 发送高八位 */
USART_SendData(pUSARTx,temp_h);
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
/* 发送低八位 */
USART_SendData(pUSARTx,temp_l);
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口 */
USART_SendData(DEBUG_USARTx, (uint8_t) ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
return (ch);
}
///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
/* 等待串口输入数据 */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(DEBUG_USARTx);
}
3. I2C
3.1 i2c.h
#define I2C_INTERFACE I2C1
#define I2C_CLK RCC_APB2Periph_I2C1
#define I2C_SCL_PORT GPIOA
#define I2C_SCL_PORT_CLK RCC_APB2Periph_GPIOA
#define I2C_SCL_PIN GPIO_Pin_5
#define I2C_SDA_PORT GPIOB
#define I2C_SDA_PORT_CLK RCC_APB2Periph_GPIOA
#define I2C_SDA_PIN GPIO_Pin_6
3.2 i2c.c
void i2c_init(void);
void i2c_master_write(uint8_t addr, uint8_t *buf, uint8_t len); // 从机地址、数据缓存区、数据长度
void i2c_master_read(uint8_t addr, uint8_t *buf, uint8_t len); // 从机地址、数据缓存区、数据长度
4. SPI
4.1 spi.h
#define SPI_INTERFACE SPI1
#define SPI_CLK RCC_APB2Periph_SPI1
#define SPI_SCL_PORT GPIOA
#define SPI_SCL_PORT_CLK RCC_APB2Periph_GPIOA
#define SPI_SCL_PIN GPIO_Pin_5
#define SPI_MISO_PORT GPIOB
#define SPI_MISO_PORT_CLK RCC_APB2Periph_GPIOA
#define SPI_MISO_PIN GPIO_Pin_6
#define SPI_MOSI_PORT GPIOA
#define SPI_MOSI_PORT_CLK RCC_APB2Periph_GPIOA
#define SPI_MOSI_PIN GPIO_Pin_7
#define SPI_NSS_PORT GPIOA
#define SPI_NSS_PORT_CLK RCC_APB2Periph_GPIOA
#define SPI_NSS_PIN GPIO_Pin_8
#define SPI_NSS_HIGH 1
#define SPI_NSS_LOW 0
#define SPI_NSS_ENABLE GPIO_WriteBit( SPI_NSS_PORT, SPI_NSS_PIN, SPI_NSS_LOW);
#define SPI_NSS_DISABLE GPIO_WriteBit( SPI_NSS_PORT, SPI_NSS_PIN, SPI_NSS_HIGH);
4.2 spi.c
void spi_init(void);
uint8_t SpiInOut(uint8_t outData);