文章目錄
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);