你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F10X VGA格式 RGB棋盘格发生器

[复制链接]
fanjiezz 发布时间:2016-12-14 21:53
有图有真相! IMG_20161214_203746_HDR.jpg




程序如下:
// VGA Output.ino
#define LED_PIN PC13
#define VGA_R PA7
#define VGA_G PA6
#define VGA_B PA5
#define VGA_V PA3
#define VGA_H PA4
#define VGA_R_HIGH (GPIOA_BASE)->BSRR = BIT(7)
#define VGA_R_LOW  (GPIOA_BASE)->BRR  = BIT(7)
#define VGA_G_HIGH (GPIOA_BASE)->BSRR = BIT(6)
#define VGA_G_LOW  (GPIOA_BASE)->BRR  = BIT(6)
#define VGA_B_HIGH (GPIOA_BASE)->BSRR = BIT(5)
#define VGA_B_LOW  (GPIOA_BASE)->BRR  = BIT(5)
#define VGA_V_HIGH (GPIOA_BASE)->BSRR = BIT(3)
#define VGA_V_LOW  (GPIOA_BASE)->BRR  = BIT(3)
#define VGA_H_HIGH (GPIOA_BASE)->BSRR = BIT(4)
#define VGA_H_LOW  (GPIOA_BASE)->BRR  = BIT(4)
#define NOP do { __asm__ __volatile__ ("nop"); } while (0)
void isr_porch(void);
void isr_start(void);
void isr_stop(void);
void isr_update(void);
boolean h_active;
int x, y = 0,z;
void setup() {
    pinMode(LED_PIN, OUTPUT);
    pinMode(VGA_R, OUTPUT);
    pinMode(VGA_G, OUTPUT);
    pinMode(VGA_B, OUTPUT);
    pinMode(VGA_V, OUTPUT);
    pinMode(VGA_H, OUTPUT);
    Timer4.pause();
    Timer4.setPrescaleFactor(1);     // 72M Full speed
    Timer4.setChannel1Mode(TIMER_OUTPUTCOMPARE);
    Timer4.setChannel2Mode(TIMER_OUTPUTCOMPARE);
    Timer4.setChannel3Mode(TIMER_OUTPUTCOMPARE);
    Timer4.setOverflow(2287);   //72M / 2287 = 31.4685KHZ
    Timer4.setCompare1(1);
    Timer4.attachCompare1Interrupt(HV);
    Timer4.setCompare2(40);
    Timer4.attachCompare2Interrupt(HS);
    Timer4.setCompare3(2140);//2100
    Timer4.attachCompare3Interrupt(HL);
    Timer4.setCount(0);
    Timer4.resume();
}
void loop() {
  //digitalWrite( LED_PIN,0);delay(500);
  //digitalWrite( LED_PIN,1);delay(500);
}
void HH(void) { VGA_H_HIGH;}
void HV(void) {
    y++;
    if( y > 523 ) { y = 0;h_active = 1;return;}
    if( y > 492 ) { VGA_V_HIGH;return;}
    if( y > 490 ) { VGA_V_LOW;return;}
    if( y > 479 ) { h_active = 0;}
    }
void HS(void) {
    VGA_H_HIGH;
    if ( h_active == 0) { return;}
    for ( x = 0; x < 22; x++){
      z=( y / 40 + x) %3;
      if ( z == 0){ VGA_B_LOW;VGA_R_HIGH;NOP;NOP;NOP;NOP;NOP;}
      if ( z == 1){ VGA_R_LOW;VGA_G_HIGH;}
      if ( z == 2){ VGA_G_LOW;VGA_B_HIGH;NOP;NOP;
      NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;}
      NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
      NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
      NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
      NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
    }
    VGA_R_LOW;VGA_G_LOW;VGA_B_LOW;
    }
void HL(void) { VGA_H_LOW; }

204123fzz87nq8imqf89fc.jpg
芯片为STM32F103C8T6,参考Crude VGA Output程序。640X480的图像不够细腻,还需改进。今抛砖引玉,望高人赐教。

评分

参与人数 1 ST金币 +10 收起 理由
zero99 + 10

查看全部评分

收藏 2 评论4 发布时间:2016-12-14 21:53

举报

4个回答
fanjiezz 回答时间:2016-12-14 22:42:04
网上对STM32F10X系列的RTC时钟有不少的非议,都觉得此类RTC很不准确。前几天有空用此板做了一下试验,觉得还不错。下面先上程序,请各位不吝赐教。
//Analog Input speed test (STM32F103C8T6 AD RTC.ino)
#include <RTClock.h>
#define LED_PIN PC13
RTClock rt (RTCSEL_HSE); //RTClock rt (RTCSEL_LSE);
int i=0,THH,TMM,TSS;
int sensorPin0 = 0,sensorValue0;//
int sensorPin1 = 1,sensorValue1;
int sensorPin2 = 2,sensorValue2;
long TimeVar;
void blink () {
  digitalWrite(LED_PIN,!digitalRead(LED_PIN));
  //RTC_GetCounter() % 86400;
  TimeVar=rt.getTime();
  if (TimeVar>86399){rtc_set_count(0);}
  THH = TimeVar / 3600;// Compute hours
  TMM = TimeVar / 60;
  while (TMM>59){TMM=TMM-60;}// Compute minutes
  TSS = TimeVar % 60;                          // Compute seconds
  Serial.print(THH);Serial.print(":");
  Serial.print(TMM);Serial.print(":");
  Serial.print(TSS);Serial.print("    ");
  Serial.print(sensorValue0);Serial.print("    ");
  Serial.print(sensorValue1);Serial.print("    ");
  Serial.print(sensorValue2);Serial.print("    ");
  Serial.println(i);
  i=0;     
  }
void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  //pinMode(sensorPin0, INPUT_ANALOG);
  //pinMode(sensorPin1, INPUT_ANALOG);
  //pinMode(sensorPin2, INPUT_ANALOG);        
  rtc_set_prescaler_load(62500); //rtc_set_prescaler_load(32768);
   rtc_set_count(43199);//11:59:59
  rt.attachSecondsInterrupt(blink);
  Serial.println("start");
}
void loop() {
  sensorValue0=analogRead(sensorPin0);
  sensorValue1=analogRead(sensorPin1);
  sensorValue2=analogRead(sensorPin2);  
  i=i+1;
}
程序里顺便把AD的读取速度测了。我用的是8M晶振分频方式,也可用32768晶振,即上面标注的LSE方式。原板上的32768晶振有问题,已换掉了。
zero99 回答时间:2016-12-14 22:21:30
看上去不错
jackten 回答时间:2016-12-15 09:15:29
很好玩的样子                       
Amaker 回答时间:2020-5-26 17:39:32
云里雾里!

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版