項目型號: Proj01_uart
// 從現在起開始使用項目型號,此程序調試通過
/*****************************************************************************
** 使用UART4通信
** TXD = PA0
** RXD = PA1
******************************************************************************
** 喬海權
** 14-04-03
******************************************************************************
** 調試記錄
// 第一次失敗了都??原因是什么??
// 判斷是 GPIO 的模式設置錯誤,我記得有文檔講的,可是沒找到啊??
// 解決辦法:官網的設置 都是 GPIO_Mode_AF,試一下吧
// 先去官網下載一個 固件庫,通用版本的,找到對應的具體芯片型號就OK. 不過有點卡 啊
// http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140#
// 點擊 all
// 第二次失敗了,發現程序一直卡在 startup_stm32f4xx.s文件里面的 hardfault_handle 這里,不清楚是怎么回事
// 解決辦法:網上提示 stm32f4xx_it.c文件沒有,加入之后一直卡在 這個文件的中斷處理函數里面,推測是硬件錯誤
// 第三次失敗
// 把對應板子的頭文件加進來試試, stm32f4_discovery.h
// 第四次失敗,建議檢查main.c 文件,是不是沒注意到的地方
// 第五次失敗,預定義里面添加 STM32F4XX
// 第六次失敗,添加 system_stm32f4xx.h 之前遇到的中斷可以OK,之所以找到這個文件,是通過對比 之前的例程,發現
// 里面并沒有定義 SystemInit 這個函數,原來這個函數在 system_stm324xx.h 這個文件里面已經定義好了。這個函數推測是
// 設置 MCU 的初始化,包括時鐘之類的。
// 總結,此次卡在 hardfault_handle 主要是 SysteInit這個函數,因為 這個函數會設置MCU 的一些默認參數,如果這個函數沒有的話,MCU會進入硬件錯誤。
*/
#include
#include
// GPIO_TypeDef 是 寄存器的數組
//GPIO_TypeDef GPIO_InitStructure; //這行代碼是錯誤的?
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef UART_InitStruct;
// 這個函數 在另外一個文件里面已經定義了
//void SystemInit(void)
//{
//}
void clk_configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
}
// 為什么頭文件改不了???
// keil 的 project里面的有些文件是 上面帶個鑰匙的,所以是鎖著的??
// OK, 把文件的屬性只讀去掉就行,在電腦里面,不是keil
void gpio_configuration(void)
{
// TXD 引腳配置,輸出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
// 根據官網的寫法,應該是 GPIO_Mode_AF
//GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// RXD 引腳配置,輸入, 我記得是有一個手冊專門講那個引腳配置成什么的,
// 為什么找不到了????
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
// 應該是 GPIO_Mode_AF
//GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
// 如果是輸入模式,下面的代碼應該是不用的吧。開漏極,或者推挽輸出??
// 官網的這句話是有的哈
//GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
// 上拉下拉設置
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
// 其實下面這句話,把結構體 GPIO_InitStruct 的參數寫進 GPIOA 里面, GPIOA 是一個GPIO 的寄存器結構體
// 按順序排列了 GPIO 的所有寄存器
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void uart4_configuration(void)
{
UART_InitStruct.USART_BaudRate = 9600;
UART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
UART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
UART_InitStruct.USART_Parity = USART_Parity_No;
UART_InitStruct.USART_StopBits = USART_StopBits_1;
UART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init(UART4, &UART_InitStruct);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_UART4);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_UART4);
}
void delay(unsigned int j)
{
while(j--);
}
// 根據 PDF文檔里面講的 alternate function mapping ,串口 4 映射到 AF8 里面,我是不是這個函數,
// 沒寫???
// 問題解決,確實是這個問題。
int main(void)
{
clk_configuration();
gpio_configuration();
uart4_configuration();
USART_Cmd(UART4, ENABLE);
while(1)
{
// 一直卡在下面這句話里面,為什么感覺 USART_IT_TXE 這個不太正確??
//while((USART_GetFlagStatus(UART4, USART_IT_TXE)) == 1);
// while((USART_GetFlagStatus(UART4, USART_FLAG_TXE)) == SET);
delay(10000);
// 下面這個函數居然跳不出來
USART_SendData(UART4, 'A');
}
}
上一篇:基于STM32的FREERTOS應用的幾個常見問題
下一篇:關于stm32 HardFault_Handler 異常的處理 死機
推薦閱讀
史海拾趣