STM32例程詳解:GPIO之JTAG_Remap
完整的工程文件夾在這里下載http://pan.baidu.com/s/1EFgkwKEIL—MDK 4.72a調(diào)試通過
//頭文件包含 ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stm32_eval.h"http://譯者注:意法半導(dǎo)體公司為其開發(fā)板上模塊所寫的頭文件
GPIO_InitTypeDef GPIO_InitStructure;//定義GPIO初始化結(jié)構(gòu)體,其原型由GPIO_InitTypeDef確定
//私有 函數(shù)原型 -----------------------------------------------*/
void RCC_Configuration(void);//復(fù)位與時(shí)鐘控制配置函數(shù)
void Delay(__IO uint32_t nCount);//非精確延時(shí)函數(shù)
int main(void)
{
//!< 在此階段,主程序執(zhí)行前,啟動(dòng)文件(startup_stm32f10x_xx.s)中調(diào)用的 SystemInit()函數(shù),已經(jīng)完成
//了控制器時(shí)鐘的配置。
//如需重新配置SystemInit()函數(shù)的默認(rèn)設(shè)置,請(qǐng)查閱system_stm32f10x.c 文件。
// 配置系統(tǒng)時(shí)鐘 */
RCC_Configuration();
// 初始化STM3210X-EVAL 板上的LED和KEY按鍵 */
//譯者注:使能LED1所在引腳的時(shí)鐘,設(shè)置LED1所在引腳為推挽輸出模式,允許頻率為50MHz, LED1在PF.6
STM_EVAL_LEDInit(LED1);
//譯者注:使能LED2所在引腳的時(shí)鐘,設(shè)置LED2所在引腳為推挽輸出模式,允許頻率為50MHz, LED2在PF.7
STM_EVAL_LEDInit(LED2);
//譯者注:使能KEY按鍵所在引腳時(shí)鐘,設(shè)置KEY按鍵所在引腳為浮空輸入模式,KEY按鍵在PG.8
STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_GPIO);
//檢測Key按鍵所在的IO引腳電平是否為低 (Key按鍵被按下) */
if (STM_EVAL_PBGetState(BUTTON_KEY) == 0x00)//譯者注:如果從KEY按鍵所在引腳讀到的電平為低
{// Key 被按下 */
//點(diǎn)亮 LED1 */
STM_EVAL_LEDOn(LED1);
// 除能串行Jtag 調(diào)試端口 SWJ-DP */
//譯者注:STM32中PA.13,PA.14,PA.15,PB.03,PB.04是默認(rèn)的JTAG引腳映射
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
// 設(shè)置 PA.13 (JTMS/SWDAT), PA.14 (JTCK/SWCLK) 和 PA.15 (JTDI) 為推挽輸出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 設(shè)置 PB.03 (JTDO) 和 PB.04 (JTRST) 為推挽輸出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
//譯者注:沒有更改的設(shè)置保持與上面一致
GPIO_Init(GPIOB, &GPIO_InitStructure);
//譯者注:經(jīng)過除能Jtag引腳,之前默認(rèn)的引腳映射被重映射成了通用IO口,
//這個(gè)循環(huán)中原先的Jtag口作為GPIO使用
while (1)
{
// 取反 JTMS/SWDAT 引腳 */
GPIO_WriteBit(GPIOA, GPIO_Pin_13, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_13)));
//譯者注:GPIOA->ODR^=GPIO_Pin_13;與其等效
//插入延時(shí) */
Delay(0x5FFFF);
// 取反 JTCK/SWCLK 引腳 */
GPIO_WriteBit(GPIOA, GPIO_Pin_14, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_14)));
//譯者注:GPIOA->ODR^=GPIO_Pin_14;與其等效
// 插入延時(shí) */
Delay(0x5FFFF);
// 取反 JTDI 引腳 */
GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_15)));
//譯者注:GPIOA->ODR^=GPIO_Pin_15;與其等效
// 插入延時(shí) */
Delay(0x5FFFF);
// 取反 JTDO 引腳 */
GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_3)));
//譯者注:GPIOB->ODR^=GPIO_Pin_3;與其等效
// 插入延時(shí) */
Delay(0x5FFFF);
// 取反JTRST 引腳 */
GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_4)));
//譯者注:GPIOB->ODR^=GPIO_Pin_4;與其等效
// 插入延時(shí) */
Delay(0x5FFFF);
}
}
else
{
// 點(diǎn)亮 LED2 */
STM_EVAL_LEDOn(LED2);
while (1)
{
}
}
}
// @簡述配置不同的系統(tǒng)時(shí)鐘.
// @參數(shù)無
// @返回?zé)o
void RCC_Configuration(void)
{
//使能 GPIOA, GPIOB, RCC_APB2Periph_GPIO_KEY_BUTTON 和 AFIO clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_AFIO, ENABLE);
}
// @簡述插入一段延時(shí).
// @參數(shù)nCount: 特定的延時(shí)長度.
// @返回?zé)o
void Delay(__IO uint32_t nCount)
{
for(; nCount != 0; nCount--);
}