}GPIO_Mode_TypeDef;
具体GPIO_Mode_TypeDef;可以查看库中的GPIO.H文件中的详细定义。
看下st给出的库提供了那些操作端口的函数吧:
这些函数的详细信息可以参考st的库说明,最好去看下函数的原型代码,这样会有更好的理解。
当然了,我在使用的时候也会做一般的说明。
voidGPIO_DeInit(GPIO_TypeDef*GPIOx);
voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_Pin_TypeDefGPIO_Pin,GPIO_Mode_TypeDefGPIO_Mode);
voidGPIO_Write(GPIO_TypeDef*GPIOx,u8PortVal);
voidGPIO_WriteHigh(GPIO_TypeDef*GPIOx,GPIO_Pin_TypeDefPortPins);
voidGPIO_WriteLow(GPIO_TypeDef*GPIOx,GPIO_Pin_TypeDefPortPins);
voidGPIO_WriteReverse(GPIO_TypeDef*GPIOx,GPIO_Pin_TypeDefPortPins);
u8GPIO_ReadInputData(GPIO_TypeDef*GPIOx);
u8GPIO_ReadOutputData(GPIO_TypeDef*GPIOx);
BitStatusGPIO_ReadInputPin(GPIO_TypeDef*GPIOx,GPIO_Pin_TypeDefGPIO_Pin);
voidGPIO_ExternalPullUpConfig(GPIO_TypeDef*GPIOx,GPIO_Pin_TypeDefGPIO_Pin,FunctionalStateNewState);
介绍到这里,对通用的I/O口有个大概的了解了吧,下面我说说我自己使用的情况:
1、首先新建工程Project,将库文件GPIO.c和GPIO.h复制到该过程目录下,
2、调用st库函数初始化端口IO:
/*函数名(端口PA口,端口第几个引脚PA4,PA5,PA6,IO模式推挽式输出_低电平_10M)*/
GPIO_Init(PORTA,(PIN4|PIN5|PIN6),GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(PORTB,(PIN0|PIN1|PIN2|PIN3),GPIO_MODE_OUT_PP_HIGH_SLOW);
/*函数名(端口名PB,端口第几个引脚PB0,PB1,PB2,PB3,IO模式推挽式输出_高电平_2M)*/
这样调用函数,初始化端口完毕。
3、在控制输出时,可以调用st库函数,这里我为了快捷,是直接对输出寄存器进行操作。
如:
GPIOA->ODR|=(1<<4);PA口的的第5为置高。
例如:
Main()
{u16i;
GPIO_Init(PORTA,(PIN4|PIN5|PIN6),GPIO_MODE_OUT_PP_LOW_FAST);
While
(1)
{GPIOA->ODR^=(1<<4);//灯闪烁
For(i=0;i<3000;i++);//延时
}
}
串口通信UART
Stm8微控制器家族的通用同步异步收发器(UART1,UART2或UART3)提供了一种灵活的方法与使用工业标准NRZ异步创行数据格式的外部设备之间进行全双共数据交换。
Stm8的UART提供宽范围的波特率选择,并且支持多处理器通讯。
后面关于宏定义有关的都不再介绍,详情请看st固件库,从这里开始只介绍如何使用st提供的固件库搭建自己的程序。
因为我用的芯片stm8s105s4只有UART2,所有这里直接调用固件库中的uart2.c和uart2.h就可以了。
Uart初始化函数如下:
UART2_DeInit();//uart2中的个寄存器清零
/*UART1configuration------------------------------------------------------*/
/*UART1configuredasfollow:
-BaudRate=9600baud
-WordLength=8Bits
-OneStopBit
-Oddparity
-Receiveandtransmitenabled//允许发送、接收
-UART1Clockdisabled*/
/*ConfiguretheUART1*/
UART2_Init((u32)9600,UART2_WORDLENGTH_8D,UART2_STOPBITS_1,UART2_PARITY_NO,UART2_SYNCMODE_CLOCK_DISABLE,UART2_MODE_TXRX_ENABLE);
//*EnabletheUART1Receiveinterrupt:
thisinterruptisgeneratedwhenthe
//UART1receivedataregisterisnotempty
UART2_ITConfig(UART2_IT_RXNE_OR,ENABLE);//开uart2接收中断
需要了解UART2_Init();可以查看uart2.c中的原型函数
这样,UART2通信已经配置好了,接下来就是使用了。
发送函数如下:
voidUART2_SendData8(u8Data)
{u8i;
/*TransmitData*/
UART2->DR=Data;
while((UART2->SR&0x40)==0);//我修改的
UART2->SR&=~(1<<6);//我修改的
}
在你需要发送数据的时候,直接调用UART2_SendData8(u8Data)就可以了。
在串口接收中断中调用读取数据函数:
u8UART2_ReceiveData8(void)
{
return((u8)UART2->DR);
}
也可以直接读取寄存器中的数据,
注意:
在中断中读完数据后,退出中断前都需要先清中断标志位,调用函数如下:
UART2_ClearITPendingBit(UART2_IT_LBDF);否则中断一直存在。
ADC转换配置:
ADC1和ADC2是10位的逐次比较型模拟数字转换器。
提供多达16路多功能的输入通道(实际准确的通道数量在数据手册的引脚描述说明)。
A/D转换的各通道可以执行单次和连续的转换模式。
相对与ADC2、ADC1具有一些扩展功能,包括扫描模式,带缓存的连续模式以及模拟看门狗。
请参考数据手册来了解不同型号的ADC1和ADC2的功能信息。
ADC开—关控制
通过置位ADC_CR1寄存器的ADON位来开启ADC。
当首次置位ADON位时,ADC从低功耗模式唤醒。
为了启转换必须第二次使用写指令来置位ADC_CR1寄存器的ADON位。
在转换结束时ADC会保持在上电状态,用户只需要置位ADON位来启动下次转换。
如果长时间没有使用ADC,推荐ADC切换到低功耗模式来降低功耗,这可以通过清零ADON位来实现。
当ADC模块上电后,所选通道对应的I/O输出模块是被禁用的,因此推荐在ADC上电前要选适合的ADC转换通道。
ADC时钟
ADC的时钟是由Fmaster时钟经过预分频后提供的。
时钟的预分频因子是由ADC_CR1寄存器的SPSEL[2:
0]决定的。
数据对齐
ADC_CR2寄存器中的ALIGN位于选择转换后数据的对齐方式:
右对齐:
8个低位数据被写入ADC_DL中,其余在ADC_DH中,读取时必须先读低位再读高位。
左对齐:
8个高位数据被写入ADC_DH中,其余在ADC_DL中,读取时必须先读高位再读低位。
我利用ST公司提供的固件库实验如下:
初始化如下(单次转换):
voidSys_ADC1_3_Int(void)
{
/*InitGPIOforADC1*/
GPIO_Init(GPIOB,(GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2),GPIO_MODE_IN_FL_NO_IT);//初始化ADC端口
CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC,ENABLE);
ADC1_DeInit();
//InitADC2peripheral
ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,ADC1_CHANNEL_0,ADC1_PRESSEL_FCPU_D2,ADC1_EXTTRIG_TIM,DISABLE,ADC1_ALIGN_RIGHT,ADC1_SCHMITTTRIG_CHANNEL0,DISABLE);
//ADC1_ITConfig(ADC1_IT_EOCIE,ENABLE);//EnableEOCinterrupt只有在使用ADC中断的时候才打开这一项
/*StartConversion*/
//ADC1_StartConversion();//启动ADC转换
}
这里ADC读取分使用中断方式和不使用两种
不使用中断,启动ADC后等待转换完毕:
ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,ADC1_CHANNEL,ADC1_PRESSEL_FCPU_D2,ADC1_EXTTRIG_TIM,DISABLE,ADC1_ALIGN_RIGHT,ADC1_CHANNEL,DISABLE);//配置ADC通道及ADC转换模式/*数据右对齐*/
ADC1_StartConversion();//启动ADC转换/*StartConversion*/
while((ADC1->CSR&0x80)!
=0x80);//等待ADC转换完毕
Adc_Value=ADC1_GetConversionValue();//读取ADC转换数据,先低位,后高位
中断方式:
在ADC中断函数中,直接读取ADC转换数据,
Adc_Value=ADC1_GetConversionValue();//读取ADC转换数据,先低位,后高位
在主程序中隔一段时间选择ADC通道和启动ADC就可以了。
ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,ADC1_CHANNEL_0,ADC1_PRESSEL_FCPU_D2,ADC1_EXTTRIG_TIM,DISABLE,ADC1_ALIGN_RIGHT,ADC1_SCHMITTTRIG_CHANNEL0,DISABLE);
//ADC1_ITConfig(ADC1_IT_EOCIE,ENABLE);//EnableEOCinterrupt只有在使用ADC中断的时候才打开这一项