一个STC单片机电路的梳理和编程
首先看原理图:
从PIN开始走:
PIN1:输入,是检测FPGA的DONE信号,表示数据流配置。
PIN2 : 输出,BOOT_SEL。输出1表示选择FX3加载FPGA配置的。输出0表示选择SPI FLASH的配置放置。 这个PIN主要接了模拟开关和M1,M2配置模式选择(参考UG360的P47)。
PIN3,4,6,输出,控制电压使能。
8,9: UART口这里外接到接插件主要用来升级STC的程序。
10:输出,控制FX3单片机的复位。
11:输入,VUSB_OK 用来判断USB电源是否就位,如果电源有了,则可以延时几百毫秒后给FX3复位(通过拉低PIN10)。
12:输入,EXT_RST外部复位输出。这里规定低电平实现复位,需要在STC程序里面实现这部分逻辑。
13:输出,控制3.6V射频部分电压使能。
14:输入作为一个备用的跳线选择工作模式。
15:作为一个备用的按键输入控制,(为了兼容以前的板子可以考虑作为一个复位键)。
16:输出,接FPGA的PROG脚,输出0表示让FPGA丢失配置或者从新配置。
17,18,19:输出接控制灯,RGB三色,低电平点亮。
=========================================================================
其次将这些引脚对应成C代码的定义:
#define I_FPGA_DONE P15#define O_BOOT_SEL P16#define O_EN_1V2 P17#define O_EN_1V0 P54#define O_EN_2V5 P55#define O_EN_2V6 P11#define O_FX3RSTn P32#define I_VUSB_OK P33#define I_EXT_RSTn P34#define O_EN_3V6 P35#define I_MCU_P36 P36#define O_FPGA_PRGn P10#define O_LED_R P12#define O_LED_G P13#define O_LED_B P14
这里我们用到了两个函数,一个是毫秒的延迟函数,以及设置io方向的函数,如下:
// n up to 65*1000
void delay_ms (unsigned int n ) //@11.0592MHz
{unsigned int i ; while(n--) for(i=0;i<790;++i);
}// 1 input
// 0 output
void set_io_dir(unsigned char port,unsigned char the_bit,unsigned char dir){
static unsigned char p1m0, p3m0, p5m0;unsigned char t ;t = 1 << the_bit ;if (port==1) { if(dir == 0) p1m0 |= t; else p1m0 &= ~t ; } else if (port==3) { if(dir == 0)p3m0 |= t; else p3m0 &= ~t ; } else if (port==5) {if(dir == 0) p5m0 |= t; else p5m0 &= ~t ; } else if (port==0xff) {p1m0 = p3m0 = p5m0 = 0 ;}P5M0 = p5m0 ; P5M1 = ~p5m0 ;P3M0 = p3m0 ; P3M1 = ~p3m0 ;P1M0 = p1m0 ; P1M1 = ~p1m0 ;
}
我们首先设置一下输出的初始值,之后设置一下输入和输出的方向。
#define I_FPGA_DONE P15
#define O_BOOT_SEL P16
#define O_EN_1V2 P17
#define O_EN_1V0 P54
#define O_EN_2V5 P55
#define O_EN_2V6 P11
#define O_FX3RSTn P32
#define I_VUSB_OK P33
#define I_EXT_RSTn P34
#define O_EN_3V6 P35
#define I_MCU_P36 P36
#define O_FPGA_PRGn P10
#define O_LED_R P12
#define O_LED_G P13
#define O_LED_B P14void set_output_def_value (){O_BOOT_SEL = 1 ; O_EN_1V2 = 0 ;O_EN_1V0 = 0 ;O_EN_2V5 = 0 ;O_EN_2V6 = 0 ;O_FX3RSTn = 0 ; O_EN_3V6 = 0 ;O_FPGA_PRGn = 0 ; O_LED_R = 1 ;O_LED_G = 1 ; O_LED_B = 1 ;
}void set_all_pin_dir (){
//set_io_dir(unsigned char port,unsigned char the_bit,unsigned char dir) dir =0 for output //#define I_FPGA_DONE P15
set_io_dir(1,5,1);//#define O_BOOT_SEL P16
set_io_dir(1,6,0);//#define O_EN_1V2 P17
set_io_dir(1,7,0);//#define O_EN_1V0 P54
set_io_dir(5,4,0);//#define O_EN_2V5 P55
set_io_dir(5,5,0);//#define O_EN_2V6 P11
set_io_dir(1,1,0);//#define O_FX3RSTn P32
set_io_dir(3,2,0);//#define I_VUSB_OK P33
set_io_dir(3,3,1);//#define I_EXT_RSTn P34
set_io_dir(3,4,1);//#define O_EN_3V6 P35
set_io_dir(3,5,0);//#define I_MCU_P36 P36
set_io_dir(3,6,1);//#define O_FPGA_PRGn P10
set_io_dir(1,0,0);//#define O_LED_R P12
set_io_dir(1,2,0);//#define O_LED_G P13
set_io_dir(1,3,0);//#define O_LED_B P14
set_io_dir(1,4,0);}
接下来要做的写一个控制上点顺序的程序。其实就是先让USB接口芯片以及FPGA以及无线电都处于复位状态,全部电源都给上之后,保持半秒钟再以此释放USB接口芯片和FPGA的PROGn脚。
这是一个很简单的上电序列,暂且定义函数名为simple_power_up ;
//r=1 : led r on
//r=0 : led r offvoid set_led_rgb(unsigned char r,unsigned char g ,unsigned b){
O_LED_R = (r==0)?1:0;
O_LED_G = (g==0)?1:0;
O_LED_B = (b==0)?1:0;//if (r)O_LED_R=0;else O_LED_R=1;
//if (g)O_LED_G=0;else O_LED_G=1;
//if (b)O_LED_B=0;else O_LED_B=1; }void simple_power_up (){
O_FPGA_PRGn = 0;
O_FX3RSTn = 0 ;O_BOOT_SEL = 1 ;
O_EN_1V2 = 1 ;
O_EN_1V0 = 1 ;
O_EN_2V5 = 1 ;
O_EN_2V6 = 1 ;
//O_FX3RSTn = 0 ;
O_EN_3V6 = 1 ;
//O_FPGA_PRGn = 0 ;
delay_ms(300);
O_FPGA_PRGn = 1;
O_FX3RSTn = 1 ;}main (){
set_output_def_value ();
set_all_pin_dir ();
set_led_rgb(1,0,0);delay_ms(300);
set_led_rgb(0,1,0);delay_ms(300);
set_led_rgb(0,0,1);delay_ms(300);
simple_power_up();
set_led_rgb(0,0,0);//delay_ms(300);
for(;;)if (I_FPGA_DONE)set_led_rgb(1,1,1);else set_led_rgb(0,0,0);
}
=========================================================================
最后编译排错。最后全部程序如下所示:
#include "intrins.h"
#include "stc8g1k08.h"// n up to 65*1000
void delay_ms (unsigned int n ) //@11.0592MHz
{unsigned int i ; while(n--) for(i=0;i<790;++i);
}// 1 input
// 0 output
void set_io_dir(unsigned char port,unsigned char the_bit,unsigned char dir){
static unsigned char p1m0, p3m0, p5m0;unsigned char t ;t = 1 << the_bit ;if (port==1) { if(dir == 0) p1m0 |= t; else p1m0 &= ~t ; } else if (port==3) { if(dir == 0)p3m0 |= t; else p3m0 &= ~t ; } else if (port==5) {if(dir == 0) p5m0 |= t; else p5m0 &= ~t ; } else if (port==0xff) {p1m0 = p3m0 = p5m0 = 0 ;}P5M0 = p5m0 ; P5M1 = ~p5m0 ;P3M0 = p3m0 ; P3M1 = ~p3m0 ;P1M0 = p1m0 ; P1M1 = ~p1m0 ;
}//#define M0 P14
//#define M1 P10
//#define M2 P370 slave spi flash
1 active serial from fx3
//void set_cfg_mode(unsigned char mode){
// set_io_dir(1,4,0); set_io_dir(1,0,0); set_io_dir(3,7,0);
// if (mode == 0 ) {
// M0 = 0 ; M1 = 0 ; M2 = 1 ;
// } else if (mode == 1 ) {
// M0 = 1 ; M1 = 1 ; M2 = 1 ;
// }
//}//
#define I_FPGA_DONE P15
#define O_BOOT_SEL P16
#define O_EN_1V2 P17
#define O_EN_1V0 P54
#define O_EN_2V5 P55
#define O_EN_2V6 P11
#define O_FX3RSTn P32
#define I_VUSB_OK P33
#define I_EXT_RSTn P34
#define O_EN_3V6 P35
#define I_MCU_P36 P36
#define O_FPGA_PRGn P10
#define O_LED_R P12
#define O_LED_G P13
#define O_LED_B P14void set_output_def_value (){O_BOOT_SEL = 1 ; O_EN_1V2 = 0 ;O_EN_1V0 = 0 ;O_EN_2V5 = 0 ;O_EN_2V6 = 0 ;O_FX3RSTn = 0 ; O_EN_3V6 = 0 ;O_FPGA_PRGn = 0 ; O_LED_R = 1 ;O_LED_G = 1 ; O_LED_B = 1 ;
}void set_all_pin_dir (){
//set_io_dir(unsigned char port,unsigned char the_bit,unsigned char dir) dir =0 for output //#define I_FPGA_DONE P15
set_io_dir(1,5,1);//#define O_BOOT_SEL P16
set_io_dir(1,6,0);//#define O_EN_1V2 P17
set_io_dir(1,7,0);//#define O_EN_1V0 P54
set_io_dir(5,4,0);//#define O_EN_2V5 P55
set_io_dir(5,5,0);//#define O_EN_2V6 P11
set_io_dir(1,1,0);//#define O_FX3RSTn P32
set_io_dir(3,2,0);//#define I_VUSB_OK P33
set_io_dir(3,3,1);//#define I_EXT_RSTn P34
set_io_dir(3,4,1);//#define O_EN_3V6 P35
set_io_dir(3,5,0);//#define I_MCU_P36 P36
set_io_dir(3,6,1);//#define O_FPGA_PRGn P10
set_io_dir(1,0,0);//#define O_LED_R P12
set_io_dir(1,2,0);//#define O_LED_G P13
set_io_dir(1,3,0);//#define O_LED_B P14
set_io_dir(1,4,0);}//r=1 : led r on
//r=0 : led r offvoid set_led_rgb(unsigned char r,unsigned char g ,unsigned b){
O_LED_R = (r==0)?1:0;
O_LED_G = (g==0)?1:0;
O_LED_B = (b==0)?1:0;//if (r)O_LED_R=0;else O_LED_R=1;
//if (g)O_LED_G=0;else O_LED_G=1;
//if (b)O_LED_B=0;else O_LED_B=1; }void simple_power_up (){
O_FPGA_PRGn = 0;
O_FX3RSTn = 0 ;O_BOOT_SEL = 1 ;
O_EN_1V2 = 1 ;
O_EN_1V0 = 1 ;
O_EN_2V5 = 1 ;
O_EN_2V6 = 1 ;
//O_FX3RSTn = 0 ;
O_EN_3V6 = 1 ;
//O_FPGA_PRGn = 0 ;
delay_ms(300);
O_FPGA_PRGn = 1;
O_FX3RSTn = 1 ;}main (){
set_output_def_value ();
set_all_pin_dir ();
while(1){
set_led_rgb(1,0,0);delay_ms(300);
set_led_rgb(0,1,0);delay_ms(300);
set_led_rgb(0,0,1);delay_ms(300);
if (I_VUSB_OK==1) break;
}
simple_power_up();
set_led_rgb(0,0,0);//delay_ms(300);
for(;;)if (I_FPGA_DONE)set_led_rgb(1,1,1);else set_led_rgb(0,0,0);
}
=========================================================================
明天继续全部静态检查一下后上板子运行。
{{aAx8MOMTIOwoMoMMVTXXxWUmIMXoxwmmHImXIHOOWTWoVoUXOIU8UmHmVmV8x8MH8mxMvUUmXTiwvUMmvOTMWMwiOMOOWxHVMviTTVHVIWVVmOwOIii8TOTXOXT8Xo8UxiHV8XV8vwxwOMivvWvHUiMiw8MITWoXvwMvIWUiTiXVmV8IxxwIoTXwmMUTMTmvWT8vixWiXoTTMmTmiOWHmMVWMiv8VOxXVUVTOOOOvWxwoMvI8xOxOwZz}}
一个STC单片机电路的梳理和编程相关推荐
- 单片机c语言中void key(void),STC单片机C语言通用万能编程模板
<STC单片机C语言通用万能编程模板>由会员分享,可在线阅读,更多相关<STC单片机C语言通用万能编程模板(23页珍藏版)>请在人人文库网上搜索. 1.8051 单片机 C 语 ...
- 通用编程c语言,STC单片机C语言通用万能编程.docx
<8051单片机C语言编程模板> TOC \o "1-5" \h \z \o "Current Document" 毫秒级CPU延时函数 4 \o ...
- c语言万能编程模板_51、STC单片机C语言通用万能编程模板
. . < 8051 单片机 C 语言编程模板> 1. 函数头文件 ............................................................ ...
- 自制STC单片机下载电路,再也不用人工干预了
关注+星标公众号,不错过精彩内容 来源 | TsinghuaJoking STC单片机的程序下载使用ISP模式,下载程序通过微机上串口,或者USB转串口,与单片机上特定的下载端口相连进行下载.不需要任 ...
- STC单片机高速下载电路改进
01改进的思路 在2020年5月20日,收到了来自STC公司发送过来更新后的STC8H技术手册,其中对于原来连接在UART-TTL转换RS232芯片与STC8H下载端口的二极管和电阻可以去掉了. 这两 ...
- STC单片机RAM在KEIL编程使用
随着STC推出的各种新型号的单片机,其RAM空间大小也已经远超传统8051单片机RAM空间,本文主要总结传统8051单片机RAM和STC单片机RAM使用问题.并且介绍如何在编程中使用STC单片机的高容 ...
- 单片机编程php,STC单片机内部FLASH读写程序(最新整理)
<STC单片机内部FLASH读写程序(最新整理)>由会员分享,可在线阅读,更多相关<STC单片机内部FLASH读写程序(最新整理)(6页珍藏版)>请在人人文库网上搜索. 1.S ...
- stc15系列c语言pwm编程,STC单片机C语言程序设计 第25章 STC单片机增强型PWM原理及实现.docx...
STC单片机C语言程序设计 第25章 STC单片机增强型PWM原理及实现 STC单片机增强型PWM发生器原理及应用主 讲:何宾Email:hebin@mail.buct.edu.cn2016.03增强 ...
- STC单片机下载电路改进
STC单片机厂家给出的参考电路如下图所示: 在对单片机下载程序时需要通过Power On开关加电(见实线红圈标出处) ,这种接法在系统没电的情况下经常不能成功下载,表现为没有响应.笔者对加电开关做了下 ...
最新文章
- c 多线程运行混乱_一篇文章读懂 Python 多线程
- 干货 |“NLP”与“语言学家”的那些事儿
- 【程序员轶事】程序员的1927年12月31日午夜一秒谜案
- sizeof和strlen解析
- Hibernate查询视图返回null问题说明及解决办法
- JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】
- Android Git 常用命令和规范
- Java 获取Web项目相对webapp地址
- 解析提高PHP执行效率的50个技巧(转)
- install python 3.5.0_Mac 下安装Python3.5出现“python3-3.5.0 already installed, it's just not linked”错误...
- Android 多屏幕适配 dp和px的关系
- margin和padding的四种写法
- 华中科技大学2005年计算机组成原理试题,华中科技大学200年计算机组成原理考研试题.doc...
- 如何衡量多元线性回归模型优劣
- 详解Linux中nohup和的用法和区别
- python编程手册 中文pdf_《Python学习手册(第4版)》高清中文PDF(《Learning Python》)...
- 使用 VBScript 判断是否安装了雅虎助手的方法
- 面经 - 计算机网络知识点
- android allow usb debugging,Android USB debugging 功能失效
- python将pvr格式转换成pvr.ccz的代码