首先看原理图:

从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单片机电路的梳理和编程相关推荐

  1. 单片机c语言中void key(void),STC单片机C语言通用万能编程模板

    <STC单片机C语言通用万能编程模板>由会员分享,可在线阅读,更多相关<STC单片机C语言通用万能编程模板(23页珍藏版)>请在人人文库网上搜索. 1.8051 单片机 C 语 ...

  2. 通用编程c语言,STC单片机C语言通用万能编程.docx

    <8051单片机C语言编程模板> TOC \o "1-5" \h \z \o "Current Document" 毫秒级CPU延时函数 4 \o ...

  3. c语言万能编程模板_51、STC单片机C语言通用万能编程模板

    . . < 8051 单片机 C 语言编程模板> 1. 函数头文件 ............................................................ ...

  4. 自制STC单片机下载电路,再也不用人工干预了

    关注+星标公众号,不错过精彩内容 来源 | TsinghuaJoking STC单片机的程序下载使用ISP模式,下载程序通过微机上串口,或者USB转串口,与单片机上特定的下载端口相连进行下载.不需要任 ...

  5. STC单片机高速下载电路改进

    01改进的思路 在2020年5月20日,收到了来自STC公司发送过来更新后的STC8H技术手册,其中对于原来连接在UART-TTL转换RS232芯片与STC8H下载端口的二极管和电阻可以去掉了. 这两 ...

  6. STC单片机RAM在KEIL编程使用

    随着STC推出的各种新型号的单片机,其RAM空间大小也已经远超传统8051单片机RAM空间,本文主要总结传统8051单片机RAM和STC单片机RAM使用问题.并且介绍如何在编程中使用STC单片机的高容 ...

  7. 单片机编程php,STC单片机内部FLASH读写程序(最新整理)

    <STC单片机内部FLASH读写程序(最新整理)>由会员分享,可在线阅读,更多相关<STC单片机内部FLASH读写程序(最新整理)(6页珍藏版)>请在人人文库网上搜索. 1.S ...

  8. stc15系列c语言pwm编程,STC单片机C语言程序设计 第25章 STC单片机增强型PWM原理及实现.docx...

    STC单片机C语言程序设计 第25章 STC单片机增强型PWM原理及实现 STC单片机增强型PWM发生器原理及应用主 讲:何宾Email:hebin@mail.buct.edu.cn2016.03增强 ...

  9. STC单片机下载电路改进

    STC单片机厂家给出的参考电路如下图所示: 在对单片机下载程序时需要通过Power On开关加电(见实线红圈标出处) ,这种接法在系统没电的情况下经常不能成功下载,表现为没有响应.笔者对加电开关做了下 ...

最新文章

  1. c 多线程运行混乱_一篇文章读懂 Python 多线程
  2. 干货 |“NLP”与“语言学家”的那些事儿
  3. 【程序员轶事】程序员的1927年12月31日午夜一秒谜案
  4. sizeof和strlen解析
  5. Hibernate查询视图返回null问题说明及解决办法
  6. JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】
  7. Android Git 常用命令和规范
  8. Java 获取Web项目相对webapp地址
  9. 解析提高PHP执行效率的50个技巧(转)
  10. install python 3.5.0_Mac 下安装Python3.5出现“python3-3.5.0 already installed, it's just not linked”错误...
  11. Android 多屏幕适配 dp和px的关系
  12. margin和padding的四种写法
  13. 华中科技大学2005年计算机组成原理试题,华中科技大学200年计算机组成原理考研试题.doc...
  14. 如何衡量多元线性回归模型优劣
  15. 详解Linux中nohup和的用法和区别
  16. python编程手册 中文pdf_《Python学习手册(第4版)》高清中文PDF(《Learning Python》)...
  17. 使用 VBScript 判断是否安装了雅虎助手的方法
  18. 面经 - 计算机网络知识点
  19. android allow usb debugging,Android USB debugging 功能失效
  20. python将pvr格式转换成pvr.ccz的代码

热门文章

  1. 狼人杀手游:一场有关技术、流量和资本的全面战争
  2. “互联网+”谋定现代农业-国稻种芯-万祥军:产业体系提升农业
  3. 转载:使用Pandas进行数据匹配
  4. 深度学习相关读书笔记
  5. 用Excel删除列表重复值
  6. 现已告别五险一金?迎来社保商保时代保险INSURAUNCE
  7. MATLAB网红时钟
  8. (五)Landat_5 TM 遥感影像计算NDVI、MNDWI、NDBI以及地表温度反演
  9. Xray CA证书配置
  10. DBeaver Ultimate 22.1 旗舰版