简介:TIM/ADC/CLOCK/EEPROM/SPI/UART/WWDG/IWDG等不使用库的应用例程,包含SPI双机通讯、定时器的捕获、PWM各功能的实现等;原理图有2个错误:1,晶振电容为22P;2,按键电容位置错;
以下模块全部已调试通过:
#include "ioSTM8S207S8.h"
#include "Includes.h"
#include "Constants.h"
#include "Functions.h"
#include "Globals.h"
/* Author: EighthArmy @ July.2010 */
/*****************************************************
@Fn: ConfigADC10()
@Br: 配置ADC10
@Pa: 无
@Rt: 无
@Sp: 无
*****************************************************/
void ConfigADC10( void ){
ADC_CSR = ( 1 << EOCIE )
+ ( 1 << CH02 ) + ( 1 << CH01 ) + ( 1 << CH00 );
/* 中断使能, 选中CH7 */
ADC_CR2 = ( 1 << ALIGN ); /* 右对齐 */
ADC_CR1 = ( 1 << SPSEL02 ) + ( 1 << SPSEL01 ) + ( 1 << SPSEL00 )
+ ( 1 << CONT ) + ( 1 << ADON );
/* Fadc = Fmaster / 18, 持续转换, ADON写1唤醒ADC */
ADC_CR1 |= ( 1 << ADON ); /* 当ADON为1时再写1则启动转换 */
}
suzhwt 发表于 2010-9-21 15:43
#include "ioSTM8S207S8.h"
#include "Includes.h"
#include "Constants.h"
#include "Functions.h"
#include "Globals.h"
/* Author: EighthArmy @ July.2010 */
/*****************************************************
@Fn: ConfigClock()
@Br: 配置处理器的时钟
@Pa: 无
@Rt: 无
@Sp: 无
*****************************************************/
void ConfigClock( void ){
CLK_ICKR = ( 1 << HSIEN ); /* 使能内部高速RC OSC */
CLK_ECKR = ( 1 << HSEEN ); /* 打开外部晶体振荡器 */
while(( CLK_ECKR & 0x02 ) == 0 ); /* ( 1 << HSERDY ) */
CLK_SWR = F_MASTER_HSE; /* 指定切换的HSE主时钟 */
while(( CLK_SWCR & 0x08 ) == 0 ); /* ( 1 << SWIF ) */
CLK_SWCR |= ( 1 << SWEN ); /* 执行切换 */
CLK_CKDIVR = 0x00; /* Fcpu = Fmaster = 18MHz */
CLK_PCKENR1 = ( 1 << TM1_CLK_ENABLE )
+ ( 1 << TM3_CLK_ENABLE )
+ ( 1 << TM2_CLK_ENABLE )
+ ( 1 << TM4_CLK_ENABLE )
+ ( 1 << UART1_CLK_ENABLE )
+ ( 1 << SPI_CLK_ENABLE );
CLK_PCKENR2 = ( 1 << ADC_CLK_ENABLE );
}
suzhwt 发表于 2010-9-21 15:43
#include "ioSTM8S207S8.h"
#include "Includes.h"
#include "Constants.h"
#include "Functions.h"
#include "Globals.h"
/* Author: EighthArmy @ July.2010 */
#define FIRST_SECURITY_KEY 0xAE
#define SECOND_SECURITY_KEY 0x56
#define ADD_EEPROM_S8 0x4000
/* STM8S207S8的CODE空间为64K,而EEPROM的大小为1536字节,即:3页 * 512节/页 */
/* EEPROM的KEY写入与FLASH的KEY正好相反 */
/*****************************************************
@Fn: InitialFlashReg()
@Br: 初始化闪存寄存器组
@Pa: 无
@Rt: 无
@Sp: 无
*****************************************************/
void InitialFlashReg( void ){
FLASH_CR1 = FLASH_CR1_RESET_VALUE;
FLASH_CR2 = FLASH_CR2_RESET_VALUE;
FLASH_NCR2 = FLASH_NCR2_RESET_VALUE;
FLASH_IAPSR &= ( uchar )(~( 1 << DUL )); /* 清除只读DATA区解锁 */
FLASH_IAPSR &= ( uchar )(~( 1 << PUL )); /* 清除程序区解锁 */
}
/*****************************************************
@Fn: UnlockFlash()
@Br: 解锁存储器
@Pa: 存储器类型: 不是程序区就是只读数据区
@Rt: 无
@Sp: 2个密钥的操作序列正好相反
*****************************************************/
void UnlockFlash( uchar Type ){
if( Type == UNLOCK_FLASH_TYPE ) /* 解锁程序区 */
{
FLASH_DUKR = SECOND_SECURITY_KEY;
FLASH_DUKR = FIRST_SECURITY_KEY;
}
else /* 解锁只读数据区 */
{
FLASH_DUKR = FIRST_SECURITY_KEY;
FLASH_DUKR = SECOND_SECURITY_KEY;
}
}
/*****************************************************
@Fn: LockFlash()
@Br: 锁定存储器
@Pa: 存储器类型:不是程序区就是只读数据区
@Rt: 无
@Sp: 无
*****************************************************/
void LockFlash( uchar Type ){
if( Type == UNLOCK_FLASH_TYPE )
{
FLASH_IAPSR &= ~( 1 << PUL );
}
else
{
FLASH_IAPSR &= ~( 1 << DUL );
}
}
/*****************************************************
@Fn: InitialFlashReg()
@Br: 写入一字节到指定只读数据区[EEPROM]
@Pa: 指定EEPROM地址与数据内容
@Rt: 无
@Sp: 无
*****************************************************/
void WriteByteToFLASH( ulong Address, uchar Data ){
*(( __far uchar * ) Address ) = Data;
}
/*****************************************************
@Fn: Write4BytToFlash()
@Br: 写入4字节到指定EEPROM的连续4字节空间
@Pa: EEPROM地址与LONG型数据内容
@Rt: 无
@Sp: 数据写入方式为小端模式
*****************************************************/
void Write4BytToFlash( ulong Address, ulong Data ){
/* Enable Word Write Once */
FLASH_CR2 |= ( 1 << WPRG );
FLASH_NCR2 &= ( uchar )( ~( 1 << NWPRG ));
*((( __far uchar * )Address ) + 3 ) = *(( uchar * )( &Data )); /* Write one byte - from Highest address*/
*((( __far uchar * )Address ) + 2 ) = *(( uchar * )( &Data ) + 1 ); /* Write one byte*/
*((( __far uchar * )Address ) + 1 ) = *(( uchar * )( &Data ) + 2 ); /* Write one byte*/
*(( __far uchar * )Address ) = *(( uchar * )( &Data ) + 3 ); /* Write one byte - from higher address*/
}
/*****************************************************
@Fn: ReadByteEEPROM()
@Br: 从EEPROM中读取1字节
@Pa: 指定EEPROM地址
@Rt: 读取的CHAR型内容
@Sp: 无
*****************************************************/
uchar ReadByteEEPROM( ulong Address ){
return(*(( __far uchar* ) Address )); /* Read byte */
}
/*****************************************************
@Fn: Read4BytFromFlash()
@Br: 从EEPROM中读取连续的4字节
@Pa: 指定EEPROM地址
@Rt: 读取的LONG内容
@Sp: 小端模式
*****************************************************/
ulong Read4BytFromFlash( ulong Address ){
ulong i;
ulong Temp[2];
Temp[0] = *(( __far uchar * )Address );
Temp[0] |= ( *((( __far uchar * )Address ) + 1 ) << 8 );
Temp[1] = *((( __far uchar * )Address ) + 2 );
Temp[1] |= ( *((( __far uchar * )Address ) + 3 ) << 8 );
i = Temp[0] + ( Temp[1] << 16 );
free( Temp );
return i;
}
/*****************************************************
@Fn: EraseByteFLASH()
@Br: 擦除EEPROM中内容
@Pa: 指定EEPROM地址
@Rt: 无
@Sp: 无
*****************************************************/
void EraseByteFLASH( uint Address ){
*(( __near uchar * ) Address ) = 0x00;
}
void Test( void ){
ulong i;
UnlockFlash( UNLOCK_EEPROM_TYPE );
Write4BytToFlash( ADD_EEPROM_S8, 0x12345678 );
LockFlash( UNLOCK_EEPROM_TYPE );
i = Read4BytFromFlash( ADD_EEPROM_S8 );
i = i;
}
suzhwt 发表于 2010-9-21 15:43
#include "ioSTM8S207S8.h"
#include "Includes.h"
#include "Constants.h"
#include "Functions.h"
#include "Globals.h"
/* Author: EighthArmy @ July.2010 */
/*****************************************************
@Fn: ConfigPortE()
@Br: 配置端口E
@Pa: 无
@Rt: 无
@Sp: 无
*****************************************************/
void ConfigPortE( void ){
PE_DDR = ( 1 << PE6 ) + ( 1 << PE5 );
PE_CR1 = 0;
PE_CR2 = 0;
}
/*****************************************************
@Fn: ConfigGPIO()
@Br: 配置端口
@Pa: 无
@Rt: 无
@Sp: 无
*****************************************************/
void ConfigGPIO( void ){
PG_DDR = 0x03; /* 输出 */
PG_CR1 = 0x03; /* 推挽模式 */
PG_CR2 = 0x00; /* 速度2MHz */
ConfigPortE();
}
suzhwt 发表于 2010-9-21 15:44
#include "ioSTM8S207S8.h"
#include "Includes.h"
#include "Constants.h"
#include "Functions.h"
#include "Globals.h"
/* Author: EighthArmy @ July.2010 */
/*****************************************************
@Fn: ConfigIWDG()
@Br: IWDG初始化
@Pa: 无
@Rt: 无
@Sp: 需要选择字支持
*****************************************************/
void ConfigIWDG( void ){
IWDG_KR = IWDG_KEY_ACCESS; /* 写入修改值使能键值 */
IWDG_PR = ( 1 << IWDG_PR02 ) + ( 1 << IWDG_PR01 ); /* 1.02s时长 */
IWDG_RLR = 0xFF;
IWDG_KR = IWDG_KEY_REFRESH; /* 写入后恢复到保护状态 */
IWDG_KR = IWDG_KEY_EBABLE; /* 启动看门狗 */
}
/*****************************************************
@Fn: ClearIWDG()
@Br: 清看门狗IWDG
@Pa: 无
@Rt: 无
@Sp: 无
*****************************************************/
void ClearIWDG( void ){
IWDG_KR = IWDG_KEY_REFRESH; /* 清看门狗 */
}
suzhwt 发表于 2010-9-21 15:44
#include "ioSTM8S207S8.h"
#include "Includes.h"
#include "Constants.h"
#include "Functions.h"
#include "Globals.h"
/* Author: EighthArmy @ July.2010 */
/*****************************************************
@Fn: ConfigInterrupt()
@Br: 配置中断输入口
@Pa: 无
@Rt: 无
@Sp: 无
*****************************************************/
void ConfigInterrupt( void ){
PA_DDR &= ~( 1 << PA6 ); /* 配置为输入口 */
PA_CR1 = ( 1 << C16 ); /* 配置上拉电阻 */
PA_CR2 = ( 1 << C26 ); /* 使能中断 */
CPU_CCR |= ( 1 << I1 ) + ( 1 << I0 ); /* 改为最高优先级 */
EXTI_CR1 = 0; /* 下降沿和低电平触发 */
}
suzhwt 发表于 2010-9-21 15:44
#include "ioSTM8S207S8.h"
#include "Includes.h"
#include "Constants.h"
#include "Functions.h"
#include "Globals.h"
/* Author: EighthArmy @ July.2010 */
/*****************************************************
@Fn: ConfigSPI()
@Br: 配置SPI接口
@Pa: 工作模式
@Rt: 无
@Sp: 无
*****************************************************/
void ConfigSPI( uchar WorkMode ){
SPI_CR1 = 0x00;
SPI_CR2 = ( uchar )( 1 << SSM ); /* SSI位的值代替NSS脚控制从设备的选择 */
SPI_ICR = 0x00;
SPI_SR = ( uchar )( 1 << SPI_TXE );
SPI_CR1 = ( uchar )(( uchar )( 1 << LSBFIRST )
+ ( uchar )( 1 << BR02 ) /* 波特率 = 2 ^ ( BR[2:0] + 1 ) = Fmaster/32 */
+ ( uchar )( 1 << SPI_CPOL )
+ ( uchar )( 1 << SPI_CPHA ));
if( WorkMode == SPI_MASTER_MODE )
{
SPI_CR2 |= ( uchar )( 1 << SSI );
SPI_CR1 |= ( uchar )( 1 << MSTR );
}
else
{
SPI_CR2 &= ~( uchar )( 1 << SSI );
SPI_CR1 &= ~( uchar )( 1 << MSTR );
}
SPI_ICR |= ( uchar )( 1 << RXIE ); /* 使能SPI接收中断 */
}
/*****************************************************
@Fn: EnablesSPI()
@Br: SPI状态
@Pa: 不是打开就是关闭
@Rt: 无
@Sp: 无
*****************************************************/
void EnablesSPI( uchar Type ){
if( Type == SPI_ENABLES )
{
SPI_CR1 |= ( uchar )( 1 << SPE );
}
else
{
SPI_CR1 &= ~( uchar )( 1 << SPE );
}
}
/*****************************************************
@Fn: TransmitBySPI()
@Br: 从SPI传输数据
@Pa: 数据组冲以及发送帧的长度
@Rt: 无
@Sp: 无
*****************************************************/
void TransmitBySPI( uchar *Buff, uchar Len ){
for( uchar i = 0; i < Len; i++ )
{
SPI_DR = *Buff++;
while( SPI_SR & ( 1 << TXE ) == 0 );
}
}
suzhwt 发表于 2010-9-21 15:44
#include "ioSTM8S207S8.h"
#include "Includes.h"
#include "Constants.h"
#include "Functions.h"
#include "Globals.h"
/* Author: EighthArmy @ July.2010 */
/* Excel2000 expression as: v = sin( DEGREE * PI()/180 ) */
/* 0 degree = 0x024A / 2 = 0x0125 = 293 */
/* 10 degree = 0x0125 + sin10 = 344 */
#define SIN_WAVE_LEN 36
const uint SIN_TABLE[SIN_WAVE_LEN] = {
9376, 9312, 9088, 8752, 8272, 7696,
设计资源 培训 开发板 精华推荐
- NCP606 典型应用 可调版本典型应用 (Vout = 1.25 V)
- LTC1290 与 IBM PC 串行端口的 12 位 8 通道数据采集系统接口
- NCV7718GEVB,具有保护功能的 NCV7718 六角半桥驱动器评估板
- 基于STM32单片机四轴飞行器控制系统(原理图PCB、程序源码)
- LTC2274CUJ 演示板,16 位,105Msps 串行 ADC,1MHz
- LT3506A 具有排序功能的扁平 1.8V 和 1.3V 输出的典型应用电路,最大高度 = 1.2mm
- LTC1728ES5-2.5、3.3V 和 5V Plus 可调双电源监视器的典型应用
- 采用 IMON 的 LT3089IR 线性稳压器的典型应用电路消除镇流器电阻压降
- 5.1V 直流转直流单路输出电源
- LT1021DIN8-5 负串联电压基准的典型应用