/****
本例子简单 就是利用TIM1输出比较功能 “输出”来输出占空比可调的 信号,可以输出占空比可调的PWM 波
注意是 串口的 波特率 和输出信号 怎么计算
*/
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "stm8s105c4.h"
#include "stdio.h"
#include "stm8s.h"
/****************************************/
#define UNIQUE_ID_START_ADDR 0X48CD
unsigned char i;
int temp;
char t;
unsigned char *pid;
//此部分是测试单片机 唯一ID 使用 与测试IO 频率占空比没有钉钉关系
//如果注释掉 TIM1 部分代码是没有关系的 串口就会输出 ID 值
/********************************************/
//TIM1 控制整流电机 转速
//PC1 输出占空比75%的PWM
//PC2 输出占空比50%的PWM
_Bool in1 @PB_ODR:3;
_Bool in2 @PB_ODR:4;
_Bool in3 @PB_ODR:5;
_Bool in4 @PB_ODR:6;
void delay(unsigned int t)
{
while(t--);
}
void tim1_oc1_init(void)
{ //2000.000/X = 16000 X=125HZ
TIM1_ARRH = 0X3E;
TIM1_ARRL = 0X80;
//占空比计算 12000/16000 = 75%
TIM1_CCR1H = 0X2E;
TIM1_CCR1L = 0X30;
//模式选择
//通道配置输出
//110 PWM模式1 向上计数
TIM1_CCMR1 = 0X60;
//
TIM1_CCER1 = 0X01;
//
TIM1_OISR = 0X01;
}
void tim1_oc2_init(void)
{ //2000.000/X = 8000 X=250HZ
TIM1_ARRH = 0X1F;
TIM1_ARRL = 0X40;
//占空比计算 8000/16000 = 50%
TIM1_CCR1H = 0X2E;
TIM1_CCR1L = 0X30;
//模式选择
//通道配置输出
//110 PWM模式1 向上计数
TIM1_CCMR1 = 0X60;
//
TIM1_CCER1 = 0X11;
//
TIM1_CR1 = 0X01;
TIM1_OISR = 0X01;
//
TIM1_BKR = 0X80;
}
void uart2_init(void)
{
UART2_CR1 = 0X00;
//控制寄存器 1
//R8存放接收到的字第9位
//T8 存放发送字的第9位
//UARTD=0 使能
//WAIE 被空闲总线唤醒
//PCEN UART 模式=0 奇偶校验 禁止
//PS 奇偶校验选择 这里不选择
//PIEN 校验中断 = 0 禁止
UART2_CR2 = 0X0C;//0000 1100
//发送接收使能
UART2_CR3 = 0X20; //0010
//00 1个停止位
//01 保留
//10 2个停止位
// 11 1.5 个停止位
UART2_BRR2 = 0X00; //2MHZ 下9600
UART2_BRR1 = 0X0D; //2000000/9600 = 208 =D0 =00D0
//设置波特率
//这个波特率设置很有意思
//不是直接赋值 而是 达到的 16进制数
// 中间两位赋值 给BRR1 两边2为赋值给BRR2
}
char putchar(char c)
{
UART2_DR = c;
while(!(UART2_SR & 0X80));
return c;
}
char getchar(void)
{
char c;
while(!(UART2_SR & 0X20));
return (UART2_DR);
}
void gpio_init(void)
{
PE_ODR = 0XFF;
PE_DDR = 0XFF;
PE_CR1 = 0XFF;
PE_CR2 = 0X00;
}
main()
{
//gpio_init();
uart2_init(); //串口2 初始化
printf("系统初始化完成 !\r\n");
//printf("芯片96位唯一ID为:\r\n");
//pid = (unsigned char *)UNIQUE_ID_START_ADDR;
/**********************************
for(i=0;i<12;i++)
{
temp = (int)*(pid++);
printf("0x%0.2x\r\n",temp);
}
**********************************/
tim1_oc2_init();
tim1_oc2_init();
while (1)
{
/**************************************
printf("输入:(a,LED亮 b,LED灭)\r\n");
t = getchar();
switch(t)
{
case 'a': printf("LED 亮\r\n");
PE_ODR = 0X00;
break;
case 'b': printf("LED 灭\r\n");
PE_ODR = 0B00110011;
break;
default:
printf("输入错误!\r\n");
break;
}
*****************************************/
;
}
}
|