• 一个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代码的定义:

    1. #define  I_FPGA_DONE  P15
    2. #define O_BOOT_SEL P16
    3. #define O_EN_1V2  P17
    4. #define O_EN_1V0  P54
    5. #define O_EN_2V5  P55
    6. #define O_EN_2V6  P11
    7. #define O_FX3RSTn P32
    8. #define I_VUSB_OK P33
    9. #define I_EXT_RSTn P34
    10. #define O_EN_3V6 P35
    11. #define I_MCU_P36 P36
    12. #define O_FPGA_PRGn P10
    13. #define O_LED_R P12
    14. #define O_LED_G P13
    15. #define O_LED_B P14

    这里我们用到了两个函数,一个是毫秒的延迟函数,以及设置io方向的函数,如下:

    1. // n up to 65*1000
    2. void delay_ms (unsigned int n ) //@11.0592MHz
    3. {
    4. unsigned int i ; while(n--) for(i=0;i<790;++i);
    5. }
    6. // 1 input
    7. // 0 output
    8. void set_io_dir(unsigned char port,unsigned char the_bit,unsigned char dir){
    9. static unsigned char p1m0, p3m0, p5m0;
    10. unsigned char t ;
    11. t = 1 << the_bit ;
    12. if (port==1) { if(dir == 0) p1m0 |= t; else p1m0 &= ~t ; }
    13. else if (port==3) { if(dir == 0)p3m0 |= t; else p3m0 &= ~t ; }
    14. else if (port==5) {if(dir == 0) p5m0 |= t; else p5m0 &= ~t ; }
    15. else if (port==0xff) {p1m0 = p3m0 = p5m0 = 0 ;}
    16. P5M0 = p5m0 ; P5M1 = ~p5m0 ;
    17. P3M0 = p3m0 ; P3M1 = ~p3m0 ;
    18. P1M0 = p1m0 ; P1M1 = ~p1m0 ;
    19. }

    我们首先设置一下输出的初始值,之后设置一下输入和输出的方向。

    1. #define  I_FPGA_DONE  P15
    2. #define O_BOOT_SEL P16
    3. #define O_EN_1V2  P17
    4. #define O_EN_1V0  P54
    5. #define O_EN_2V5  P55
    6. #define O_EN_2V6  P11
    7. #define O_FX3RSTn P32
    8. #define I_VUSB_OK P33
    9. #define I_EXT_RSTn P34
    10. #define O_EN_3V6 P35
    11. #define I_MCU_P36 P36
    12. #define O_FPGA_PRGn P10
    13. #define O_LED_R P12
    14. #define O_LED_G P13
    15. #define O_LED_B P14
    16. void set_output_def_value (){
    17. O_BOOT_SEL = 1 ;
    18. O_EN_1V2  = 0 ;
    19. O_EN_1V0  = 0 ;
    20. O_EN_2V5  = 0 ;
    21. O_EN_2V6  = 0 ;
    22. O_FX3RSTn = 0 ;
    23. O_EN_3V6 = 0 ;
    24. O_FPGA_PRGn = 0 ;
    25. O_LED_R = 1 ;
    26. O_LED_G  = 1 ;
    27. O_LED_B  = 1 ;
    28. }
    29. void set_all_pin_dir (){
    30. //set_io_dir(unsigned char port,unsigned char the_bit,unsigned char dir) dir =0 for output
    31. //#define  I_FPGA_DONE  P15
    32. set_io_dir(1,5,1);
    33. //#define O_BOOT_SEL P16
    34. set_io_dir(1,6,0);
    35. //#define O_EN_1V2  P17
    36. set_io_dir(1,7,0);
    37. //#define O_EN_1V0  P54
    38. set_io_dir(5,4,0);
    39. //#define O_EN_2V5  P55
    40. set_io_dir(5,5,0);
    41. //#define O_EN_2V6  P11
    42. set_io_dir(1,1,0);
    43. //#define O_FX3RSTn P32
    44. set_io_dir(3,2,0);
    45. //#define I_VUSB_OK P33
    46. set_io_dir(3,3,1);
    47. //#define I_EXT_RSTn P34
    48. set_io_dir(3,4,1);
    49. //#define O_EN_3V6 P35
    50. set_io_dir(3,5,0);
    51. //#define I_MCU_P36 P36
    52. set_io_dir(3,6,1);
    53. //#define O_FPGA_PRGn P10
    54. set_io_dir(1,0,0);
    55. //#define O_LED_R P12
    56. set_io_dir(1,2,0);
    57. //#define O_LED_G P13
    58. set_io_dir(1,3,0);
    59. //#define O_LED_B P14
    60. set_io_dir(1,4,0);
    61. }

    接下来要做的写一个控制上点顺序的程序。其实就是先让USB接口芯片以及FPGA以及无线电都处于复位状态,全部电源都给上之后,保持半秒钟再以此释放USB接口芯片和FPGA的PROGn脚。

    这是一个很简单的上电序列,暂且定义函数名为simple_power_up ;

    1. //r=1 : led r on
    2. //r=0 : led r off
    3. void set_led_rgb(unsigned char r,unsigned char g ,unsigned b){
    4. O_LED_R = (r==0)?1:0;
    5. O_LED_G = (g==0)?1:0;
    6. O_LED_B = (b==0)?1:0;
    7. //if (r)O_LED_R=0;else O_LED_R=1;
    8. //if (g)O_LED_G=0;else O_LED_G=1;
    9. //if (b)O_LED_B=0;else O_LED_B=1;
    10. }
    11. void simple_power_up (){
    12. O_FPGA_PRGn = 0;
    13. O_FX3RSTn = 0 ;
    14. O_BOOT_SEL = 1 ;
    15. O_EN_1V2  = 1 ;
    16. O_EN_1V0  = 1 ;
    17. O_EN_2V5  = 1 ;
    18. O_EN_2V6  = 1 ;
    19. //O_FX3RSTn = 0 ;
    20. O_EN_3V6 = 1 ;
    21. //O_FPGA_PRGn = 0 ;
    22. delay_ms(300);
    23. O_FPGA_PRGn = 1;
    24. O_FX3RSTn = 1 ;
    25. }
    26. main (){
    27. set_output_def_value ();
    28. set_all_pin_dir ();
    29. set_led_rgb(1,0,0);delay_ms(300);
    30. set_led_rgb(0,1,0);delay_ms(300);
    31. set_led_rgb(0,0,1);delay_ms(300);
    32. simple_power_up();
    33. set_led_rgb(0,0,0);//delay_ms(300);
    34. for(;;)if (I_FPGA_DONE)set_led_rgb(1,1,1);else set_led_rgb(0,0,0);
    35. }

    =========================================================================

    最后编译排错。最后全部程序如下所示:

    1. #include "intrins.h"
    2. #include "stc8g1k08.h"
    3. // n up to 65*1000
    4. void delay_ms (unsigned int n ) //@11.0592MHz
    5. {
    6. unsigned int i ; while(n--) for(i=0;i<790;++i);
    7. }
    8. // 1 input
    9. // 0 output
    10. void set_io_dir(unsigned char port,unsigned char the_bit,unsigned char dir){
    11. static unsigned char p1m0, p3m0, p5m0;
    12. unsigned char t ;
    13. t = 1 << the_bit ;
    14. if (port==1) { if(dir == 0) p1m0 |= t; else p1m0 &= ~t ; }
    15. else if (port==3) { if(dir == 0)p3m0 |= t; else p3m0 &= ~t ; }
    16. else if (port==5) {if(dir == 0) p5m0 |= t; else p5m0 &= ~t ; }
    17. else if (port==0xff) {p1m0 = p3m0 = p5m0 = 0 ;}
    18. P5M0 = p5m0 ; P5M1 = ~p5m0 ;
    19. P3M0 = p3m0 ; P3M1 = ~p3m0 ;
    20. P1M0 = p1m0 ; P1M1 = ~p1m0 ;
    21. }
    22. //#define M0 P14
    23. //#define M1 P10
    24. //#define M2 P37
    25. 0 slave spi flash
    26. 1 active serial from fx3
    27. //void set_cfg_mode(unsigned char mode){
    28. // set_io_dir(1,4,0); set_io_dir(1,0,0); set_io_dir(3,7,0);
    29. // if (mode == 0 ) {
    30. // M0 = 0 ; M1 = 0 ; M2 = 1 ;
    31. // } else if (mode == 1 ) {
    32. // M0 = 1 ; M1 = 1 ; M2 = 1 ;
    33. // }
    34. //}
    35. //
    36. #define I_FPGA_DONE P15
    37. #define O_BOOT_SEL P16
    38. #define O_EN_1V2 P17
    39. #define O_EN_1V0 P54
    40. #define O_EN_2V5 P55
    41. #define O_EN_2V6 P11
    42. #define O_FX3RSTn P32
    43. #define I_VUSB_OK P33
    44. #define I_EXT_RSTn P34
    45. #define O_EN_3V6 P35
    46. #define I_MCU_P36 P36
    47. #define O_FPGA_PRGn P10
    48. #define O_LED_R P12
    49. #define O_LED_G P13
    50. #define O_LED_B P14
    51. void set_output_def_value (){
    52. O_BOOT_SEL = 1 ;
    53. O_EN_1V2 = 0 ;
    54. O_EN_1V0 = 0 ;
    55. O_EN_2V5 = 0 ;
    56. O_EN_2V6 = 0 ;
    57. O_FX3RSTn = 0 ;
    58. O_EN_3V6 = 0 ;
    59. O_FPGA_PRGn = 0 ;
    60. O_LED_R = 1 ;
    61. O_LED_G = 1 ;
    62. O_LED_B = 1 ;
    63. }
    64. void set_all_pin_dir (){
    65. //set_io_dir(unsigned char port,unsigned char the_bit,unsigned char dir) dir =0 for output
    66. //#define I_FPGA_DONE P15
    67. set_io_dir(1,5,1);
    68. //#define O_BOOT_SEL P16
    69. set_io_dir(1,6,0);
    70. //#define O_EN_1V2  P17
    71. set_io_dir(1,7,0);
    72. //#define O_EN_1V0  P54
    73. set_io_dir(5,4,0);
    74. //#define O_EN_2V5  P55
    75. set_io_dir(5,5,0);
    76. //#define O_EN_2V6  P11
    77. set_io_dir(1,1,0);
    78. //#define O_FX3RSTn P32
    79. set_io_dir(3,2,0);
    80. //#define I_VUSB_OK P33
    81. set_io_dir(3,3,1);
    82. //#define I_EXT_RSTn P34
    83. set_io_dir(3,4,1);
    84. //#define O_EN_3V6 P35
    85. set_io_dir(3,5,0);
    86. //#define I_MCU_P36 P36
    87. set_io_dir(3,6,1);
    88. //#define O_FPGA_PRGn P10
    89. set_io_dir(1,0,0);
    90. //#define O_LED_R P12
    91. set_io_dir(1,2,0);
    92. //#define O_LED_G P13
    93. set_io_dir(1,3,0);
    94. //#define O_LED_B P14
    95. set_io_dir(1,4,0);
    96. }
    97. //r=1 : led r on
    98. //r=0 : led r off
    99. void set_led_rgb(unsigned char r,unsigned char g ,unsigned b){
    100. O_LED_R = (r==0)?1:0;
    101. O_LED_G = (g==0)?1:0;
    102. O_LED_B = (b==0)?1:0;
    103. //if (r)O_LED_R=0;else O_LED_R=1;
    104. //if (g)O_LED_G=0;else O_LED_G=1;
    105. //if (b)O_LED_B=0;else O_LED_B=1;
    106. }
    107. void simple_power_up (){
    108. O_FPGA_PRGn = 0;
    109. O_FX3RSTn = 0 ;
    110. O_BOOT_SEL = 1 ;
    111. O_EN_1V2 = 1 ;
    112. O_EN_1V0 = 1 ;
    113. O_EN_2V5 = 1 ;
    114. O_EN_2V6 = 1 ;
    115. //O_FX3RSTn = 0 ;
    116. O_EN_3V6 = 1 ;
    117. //O_FPGA_PRGn = 0 ;
    118. delay_ms(300);
    119. O_FPGA_PRGn = 1;
    120. O_FX3RSTn = 1 ;
    121. }
    122. main (){
    123. set_output_def_value ();
    124. set_all_pin_dir ();
    125. while(1){
    126. set_led_rgb(1,0,0);delay_ms(300);
    127. set_led_rgb(0,1,0);delay_ms(300);
    128. set_led_rgb(0,0,1);delay_ms(300);
    129. if (I_VUSB_OK==1) break;
    130. }
    131. simple_power_up();
    132. set_led_rgb(0,0,0);//delay_ms(300);
    133. for(;;)if (I_FPGA_DONE)set_led_rgb(1,1,1);else set_led_rgb(0,0,0);
    134. }

    =========================================================================

    明天继续全部静态检查一下后上板子运行。

    {{aAx8MOMTIOwoMoMMVTXXxWUmIMXoxwmmHImXIHOOWTWoVoUXOIU8UmHmVmV8x8MH8mxMvUUmXTiwvUMmvOTMWMwiOMOOWxHVMviTTVHVIWVVmOwOIii8TOTXOXT8Xo8UxiHV8XV8vwxwOMivvWvHUiMiw8MITWoXvwMvIWUiTiXVmV8IxxwIoTXwmMUTMTmvWT8vixWiXoTTMmTmiOWHmMVWMiv8VOxXVUVTOOOOvWxwoMvI8xOxOwZz}}

  • 相关阅读:
    uniapp----微信小程序 日历组件(周日历&& 月日历)【Vue3+ts+uView】
    汇编语言实验八-《汇编语言-王爽老师》
    数据结构之顺序表和链表
    java计算机毕业设计列车票务信息管理系统源码+数据库+lw文档+系统
    ChatGPT付费创作系统V2.3.4独立版 +WEB端+ H5端 + 小程序最新前端
    洛谷P7529 Permutation G
    Google Earth Engine(GEE)——一个免费下载Landsat影像的APP
    一些坐标系概念(ECEF、ENU、WGS-84、Web墨卡托、UTM坐标系)
    缓存的6种常见的使用场景
    Unity(第十九部)射线
  • 原文地址:https://blog.csdn.net/mcupro/article/details/126387290