gpio 简单介绍

[复制链接]
 楼主| tedyu 发表于 2009-3-27 12:37 | 显示全部楼层 |阅读模式
<br />GPIO功能描述<br />每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。<br />&nbsp;<br />GPIO端口的每个位可以由软件分别配置成多种模式。<br />─输入浮空<br />─输入上拉<br />─输入下拉<br />─模拟输入<br />─开漏输出<br />─推挽式输出<br />─推挽式复用功能<br />─开漏复用功能<br />&nbsp;<br />每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。<br />&nbsp;<br />下图给出了一个I/O端口位的基本结构。<br />&nbsp;<br /><br />&nbsp;<br />&nbsp;<br />&nbsp;<br />复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b,MODEx[1:0]=00b)。<br />复位后,JTAG引脚被置于输入上拉或下拉模式:<br />─PA15:JTDI置于上拉模式<br />─PA14:JTCK置于下拉模式<br />─PA13:JTMS置于上拉模式<br />─PB4:&nbsp;JNTRST置于上拉模式<br />&nbsp;<br />当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。<br />输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。<br />所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。<br />&nbsp;<br />当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改一个或多个位。<br />这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是&nbsp;GPIOx_BRR)中想要更改的位写’1’来实现的。没被选择的位将不被更改。<br />&nbsp;<br />&nbsp;<br />复用功能(AF)<br />使用默认复用功能前必须对端口位配置寄存器编程。<br />●<br />对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入管脚必须由外部驱动<br />注意:也可以通过软件来模拟复用功能输入管脚,这种模拟可以通过对GPIO控制器编程来实现。此时,端口应当被设置为复用功能输出模式。显然,这时相应的管脚不再由外部驱动,而是通过GPIO控制器由软件来驱动。<br />●<br />对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。<br />●<br />对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。<br />如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。<br />如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。<br />&nbsp;<br />软件重新映射I/O复用功能<br />为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。<br />&nbsp;<br />输入配置<br />当I/O端口配置为输入时:<br />●输出缓冲器被禁止<br />●施密特触发输入被激活<br />●根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接<br />●出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器<br />●对输入数据寄存器的读访问可得到I/O状态<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />输出配置<br />当I/O端口被配置为输出时:<br />●输出缓冲器被激活<br />─开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(P-MOS从不被激活)。<br />─推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。<br />●施密特触发输入被激活<br />●弱上拉和下拉电阻被禁止<br />●出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器<br />●在开漏模式时,对输入数据寄存器的读访问可得到I/O状态<br />●在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />模拟输入配置<br />当I/O端口被配置为模拟输入配置时:<br />●输出缓冲器被禁止;<br />●禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为’0’;<br />●弱上拉和下拉电阻被禁止;<br />●读取输入数据寄存器时数值为’0’。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />例程(1)<br />&nbsp;<br />&nbsp;<br />本例展示了如何通过设置GPIO&nbsp;BSRR寄存器(Port&nbsp;bit&nbsp;set/reset&nbsp;registe)和GPIO&nbsp;BRR寄存器&nbsp;(Port&nbsp;bit&nbsp;reset&nbsp;register)来翻转IO的状态。<br />&nbsp;<br />通过设置这两个寄存器,可以利用单比特操作(single&nbsp;atomic&nbsp;write&nbsp;access)来改变一个或者几个IO端口的状态。<br />&nbsp;<br />#include&nbsp;&quot;stm32f10x_lib.h&quot;<br />&nbsp;<br />/*&nbsp;Private&nbsp;typedef&nbsp;-----------------------------------------------------------*/<br />/*&nbsp;Private&nbsp;define&nbsp;------------------------------------------------------------*/<br />/*&nbsp;Private&nbsp;macro&nbsp;-------------------------------------------------------------*/<br />/*&nbsp;Private&nbsp;variables&nbsp;---------------------------------------------------------*/<br />GPIO_InitTypeDef&nbsp;GPIO_InitStructure;<br />ErrorStatus&nbsp;HSEStartUpStatus;<br />&nbsp;<br />/*&nbsp;Private&nbsp;function&nbsp;prototypes&nbsp;-----------------------------------------------*/<br />void&nbsp;RCC_Configuration(void);<br />void&nbsp;NVIC_Configuration(void);<br />void&nbsp;Delay(vu32&nbsp;nCount);<br />&nbsp;<br />/*&nbsp;Private&nbsp;functions&nbsp;---------------------------------------------------------*/<br />&nbsp;<br />/*******************************************************************************<br />*&nbsp;Function&nbsp;Name&nbsp;&nbsp;:&nbsp;main<br />*&nbsp;Description&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Main&nbsp;program.<br />*&nbsp;Input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*&nbsp;Output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*&nbsp;Return&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*******************************************************************************/<br />int&nbsp;main(void)<br />{<br />#ifdef&nbsp;DEBUG<br />&nbsp;&nbsp;debug();<br />#endif<br />&nbsp;<br />&nbsp;&nbsp;/*&nbsp;Configure&nbsp;the&nbsp;system&nbsp;clocks&nbsp;*/<br />&nbsp;&nbsp;RCC_Configuration();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;/*&nbsp;NVIC&nbsp;Configuration&nbsp;*/<br />&nbsp;&nbsp;NVIC_Configuration();<br />&nbsp;<br />&nbsp;&nbsp;/*&nbsp;Enable&nbsp;GPIOC&nbsp;clock&nbsp;*/<br />&nbsp;&nbsp;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,&nbsp;ENABLE);&nbsp;//使能APB2外设(GPIOC)时钟<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;/*&nbsp;Configure&nbsp;&nbsp;PC.04-PC.07&nbsp;&nbsp;as&nbsp;Output&nbsp;push-pull&nbsp;*/<br />&nbsp;&nbsp;&nbsp;GPIO_InitStructure.GPIO_Pin&nbsp;=&nbsp;GPIO_Pin_4&nbsp;|&nbsp;GPIO_Pin_5&nbsp;|&nbsp;GPIO_Pin_6&nbsp;|&nbsp;GPIO_Pin_7;<br />&nbsp;&nbsp;GPIO_InitStructure.GPIO_Speed&nbsp;=&nbsp;GPIO_Speed_50MHz;<br />&nbsp;&nbsp;GPIO_InitStructure.GPIO_Mode&nbsp;=&nbsp;GPIO_Mode_Out_PP;<br />&nbsp;&nbsp;GPIO_Init(GPIOC,&nbsp;&GPIO_InitStructure);<br />&nbsp;<br />&nbsp;&nbsp;while&nbsp;(1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Turn&nbsp;on&nbsp;led&nbsp;connected&nbsp;to&nbsp;PC.04pin&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_SetBits(GPIOC,&nbsp;GPIO_Pin_4);<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Insert&nbsp;delay&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(0xAFFFF);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Turn&nbsp;on&nbsp;led&nbsp;connected&nbsp;to&nbsp;PC.05&nbsp;and&nbsp;PC.06&nbsp;pins&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_SetBits(GPIOC,&nbsp;GPIO_Pin_5&nbsp;|&nbsp;GPIO_Pin_6);<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Turn&nbsp;off&nbsp;led&nbsp;connected&nbsp;to&nbsp;PC.04&nbsp;pin&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_ResetBits(GPIOC,&nbsp;GPIO_Pin_4);<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Insert&nbsp;delay&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(0xAFFFF);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Turn&nbsp;on&nbsp;led&nbsp;connected&nbsp;to&nbsp;PC.07&nbsp;pin&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_SetBits(GPIOC,&nbsp;GPIO_Pin_7);<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Turn&nbsp;off&nbsp;led&nbsp;connected&nbsp;to&nbsp;PC.05&nbsp;and&nbsp;PC.06&nbsp;pins&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_ResetBits(GPIOC,&nbsp;GPIO_Pin_6&nbsp;|&nbsp;GPIO_Pin_5);<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Insert&nbsp;delay&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(0xAFFFF);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Turn&nbsp;off&nbsp;led&nbsp;connected&nbsp;to&nbsp;PC.07&nbsp;pin&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIO_ResetBits(GPIOC,&nbsp;GPIO_Pin_7);<br />&nbsp;&nbsp;}<br />}<br />&nbsp;<br />/*******************************************************************************<br />*&nbsp;Function&nbsp;Name&nbsp;&nbsp;:&nbsp;RCC_Configuration<br />*&nbsp;Description&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Configures&nbsp;the&nbsp;different&nbsp;system&nbsp;clocks.<br />*&nbsp;Input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*&nbsp;Output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*&nbsp;Return&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*******************************************************************************/<br />void&nbsp;RCC_Configuration(void)<br />{<br />&nbsp;&nbsp;/*&nbsp;RCC&nbsp;system&nbsp;reset(for&nbsp;debug&nbsp;purpose)&nbsp;*/<br />&nbsp;&nbsp;RCC_DeInit();<br />&nbsp;<br />&nbsp;&nbsp;/*&nbsp;Enable&nbsp;HSE&nbsp;*/<br />&nbsp;&nbsp;RCC_HSEConfig(RCC_HSE_ON);<br />&nbsp;<br />&nbsp;&nbsp;/*&nbsp;Wait&nbsp;till&nbsp;HSE&nbsp;is&nbsp;ready&nbsp;*/<br />&nbsp;&nbsp;HSEStartUpStatus&nbsp;=&nbsp;RCC_WaitForHSEStartUp();<br />&nbsp;<br />&nbsp;&nbsp;if(HSEStartUpStatus&nbsp;==&nbsp;SUCCESS)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Enable&nbsp;Prefetch&nbsp;Buffer&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Flash&nbsp;2&nbsp;wait&nbsp;state&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;FLASH_SetLatency(FLASH_Latency_2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;HCLK&nbsp;=&nbsp;SYSCLK&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;RCC_HCLKConfig(RCC_SYSCLK_Div1);&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;PCLK2&nbsp;=&nbsp;HCLK&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;RCC_PCLK2Config(RCC_HCLK_Div1);&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;PCLK1&nbsp;=&nbsp;HCLK/2&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;RCC_PCLK1Config(RCC_HCLK_Div2);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;PLLCLK&nbsp;=&nbsp;8MHz&nbsp;*&nbsp;9&nbsp;=&nbsp;72&nbsp;MHz&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;RCC_PLLConfig(RCC_PLLSource_HSE_Div1,&nbsp;RCC_PLLMul_9);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Enable&nbsp;PLL&nbsp;*/&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;RCC_PLLCmd(ENABLE);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Wait&nbsp;till&nbsp;PLL&nbsp;is&nbsp;ready&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)&nbsp;==&nbsp;RESET)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Select&nbsp;PLL&nbsp;as&nbsp;system&nbsp;clock&nbsp;source&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Wait&nbsp;till&nbsp;PLL&nbsp;is&nbsp;used&nbsp;as&nbsp;system&nbsp;clock&nbsp;source&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;while(RCC_GetSYSCLKSource()&nbsp;!=&nbsp;0x08)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}<br />&nbsp;<br />/*******************************************************************************<br />*&nbsp;Function&nbsp;Name&nbsp;&nbsp;:&nbsp;NVIC_Configuration<br />*&nbsp;Description&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Configures&nbsp;Vector&nbsp;Table&nbsp;base&nbsp;location.<br />*&nbsp;Input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*&nbsp;Output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*&nbsp;Return&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*******************************************************************************/<br />void&nbsp;NVIC_Configuration(void)<br />{<br />#ifdef&nbsp;&nbsp;VECT_TAB_RAM&nbsp;&nbsp;<br />&nbsp;&nbsp;/*&nbsp;Set&nbsp;the&nbsp;Vector&nbsp;Table&nbsp;base&nbsp;location&nbsp;at&nbsp;0x20000000&nbsp;*/&nbsp;<br />&nbsp;&nbsp;NVIC_SetVectorTable(NVIC_VectTab_RAM,&nbsp;0x0);&nbsp;<br />#else&nbsp;&nbsp;/*&nbsp;VECT_TAB_FLASH&nbsp;&nbsp;*/<br />&nbsp;&nbsp;/*&nbsp;Set&nbsp;the&nbsp;Vector&nbsp;Table&nbsp;base&nbsp;location&nbsp;at&nbsp;0x08000000&nbsp;*/&nbsp;<br />&nbsp;&nbsp;NVIC_SetVectorTable(NVIC_VectTab_FLASH,&nbsp;0x0);&nbsp;&nbsp;&nbsp;<br />#endif<br />}<br />&nbsp;<br />/*******************************************************************************<br />*&nbsp;Function&nbsp;Name&nbsp;&nbsp;:&nbsp;Delay<br />*&nbsp;Description&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Inserts&nbsp;a&nbsp;delay&nbsp;time.<br />*&nbsp;Input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;nCount:&nbsp;specifies&nbsp;the&nbsp;delay&nbsp;time&nbsp;length.<br />*&nbsp;Output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*&nbsp;Return&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*******************************************************************************/<br />void&nbsp;Delay(vu32&nbsp;nCount)<br />{<br />&nbsp;&nbsp;for(;&nbsp;nCount&nbsp;!=&nbsp;0;&nbsp;nCount--);<br />}<br />&nbsp;<br />#ifdef&nbsp;&nbsp;DEBUG<br />/*******************************************************************************<br />*&nbsp;Function&nbsp;Name&nbsp;&nbsp;:&nbsp;assert_failed<br />*&nbsp;Description&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Reports&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;source&nbsp;file&nbsp;and&nbsp;the&nbsp;source&nbsp;line&nbsp;number<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;the&nbsp;assert_param&nbsp;error&nbsp;has&nbsp;occurred.<br />*&nbsp;Input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;-&nbsp;file:&nbsp;pointer&nbsp;to&nbsp;the&nbsp;source&nbsp;file&nbsp;name<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;line:&nbsp;assert_param&nbsp;error&nbsp;line&nbsp;source&nbsp;number<br />*&nbsp;Output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*&nbsp;Return&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*******************************************************************************/<br />void&nbsp;assert_failed(u8*&nbsp;file,&nbsp;u32&nbsp;line)<br />{&nbsp;<br />&nbsp;&nbsp;/*&nbsp;User&nbsp;can&nbsp;add&nbsp;his&nbsp;own&nbsp;implementation&nbsp;to&nbsp;report&nbsp;the&nbsp;file&nbsp;name&nbsp;and&nbsp;line&nbsp;number,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex:&nbsp;printf(&quot;Wrong&nbsp;parameters&nbsp;value:&nbsp;file&nbsp;%s&nbsp;on&nbsp;line&nbsp;%d
&quot;,&nbsp;file,&nbsp;line)&nbsp;*/<br />&nbsp;<br />&nbsp;&nbsp;/*&nbsp;Infinite&nbsp;loop&nbsp;*/<br />&nbsp;&nbsp;while&nbsp;(1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;}<br />}<br />#endif<br />&nbsp;<br />例程2要用到JTAG&nbsp;,没有那个接口,所以不能演示。<br />&nbsp;<br />&nbsp;<br />&nbsp;<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

52

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

36

主题

52

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部