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

STM32F10X VGA格式 RGB棋盘格发生器

[复制链接]
fanjiezz 发布时间:2016-12-14 21:53
有图有真相! IMG_20161214_203746_HDR.jpg
; t0 K7 q' ~& i, H; J3 O
0 N$ B3 j) K7 x* P1 i' A  J
0 i4 _8 _8 d, G+ E' p% f" z( W+ Y% @

8 C- e3 L7 b5 b0 T  A+ I- f0 i% K! a5 P6 |" b2 s
程序如下:
# Y. i3 A2 I: W/ a2 X4 X// VGA Output.ino
* x6 X7 L; t6 A' \8 n# @  D#define LED_PIN PC13
6 u  O7 a0 k! u' v# b#define VGA_R PA7
8 b$ S3 r1 l5 L4 y! J5 N#define VGA_G PA6$ E! C. ^, ^3 L/ A7 L% g
#define VGA_B PA5- Q# `9 L/ ~& s/ i
#define VGA_V PA3
: h8 n4 w4 P; A7 r+ D. N#define VGA_H PA4# m0 I1 C6 J3 K& g9 v5 m6 J
#define VGA_R_HIGH (GPIOA_BASE)->BSRR = BIT(7)0 y$ }) x5 Q) E" M6 q  M; ?) F
#define VGA_R_LOW  (GPIOA_BASE)->BRR  = BIT(7)
/ G6 E, u3 {! z/ {- |& l#define VGA_G_HIGH (GPIOA_BASE)->BSRR = BIT(6)8 G5 k0 }2 z5 U8 }- w6 l! g
#define VGA_G_LOW  (GPIOA_BASE)->BRR  = BIT(6)/ x3 R! F" i3 m0 U
#define VGA_B_HIGH (GPIOA_BASE)->BSRR = BIT(5)
  o5 G' o& f, X7 y1 w' p# l#define VGA_B_LOW  (GPIOA_BASE)->BRR  = BIT(5)3 r* A% @5 |* {0 M$ u# N
#define VGA_V_HIGH (GPIOA_BASE)->BSRR = BIT(3)* E# G4 o, A) N: N! _9 v6 e" ^
#define VGA_V_LOW  (GPIOA_BASE)->BRR  = BIT(3)) D( i; d4 }2 A2 _
#define VGA_H_HIGH (GPIOA_BASE)->BSRR = BIT(4)
. t5 @# X$ f; |" n& Z, F8 V#define VGA_H_LOW  (GPIOA_BASE)->BRR  = BIT(4)+ W2 N1 S$ I3 S% U8 q; s
#define NOP do { __asm__ __volatile__ ("nop"); } while (0)- ~0 a% v7 p  w; S9 L- |, z; C
void isr_porch(void);3 T5 f' E! y( @1 H
void isr_start(void);5 B8 I# x" s: G5 x) e( q  V
void isr_stop(void);" p! x: H2 x/ ^# d2 K" N
void isr_update(void);7 q; S( K6 s7 j/ H
boolean h_active;
# k. m9 i  y8 Z& }int x, y = 0,z;
/ Y- ^. _; x# i) Evoid setup() {, x. q; X9 e( |) K: u: F
    pinMode(LED_PIN, OUTPUT);* L# k% z$ [3 c3 C
    pinMode(VGA_R, OUTPUT);! E+ `/ _$ l4 c0 \. z/ ]
    pinMode(VGA_G, OUTPUT);
$ t5 @5 L8 M( z; J  ?    pinMode(VGA_B, OUTPUT);
* Q6 i& ?) j7 b5 k9 N" a    pinMode(VGA_V, OUTPUT);
0 m( a. f$ N  z    pinMode(VGA_H, OUTPUT);4 `# p2 {! X# O
    Timer4.pause();
: n; j9 Q% X# K; |4 E+ o    Timer4.setPrescaleFactor(1);     // 72M Full speed
. ]) x9 n) y% W7 p7 R" {    Timer4.setChannel1Mode(TIMER_OUTPUTCOMPARE);
3 j/ a; ^, n5 L* J$ }    Timer4.setChannel2Mode(TIMER_OUTPUTCOMPARE);/ x$ x/ T# U! u$ J: r- j1 c
    Timer4.setChannel3Mode(TIMER_OUTPUTCOMPARE);  z2 L: c: I  J7 Z- i0 d
    Timer4.setOverflow(2287);   //72M / 2287 = 31.4685KHZ: U8 d' J! P5 u# L
    Timer4.setCompare1(1);, y) U/ K0 A2 D, \' J
    Timer4.attachCompare1Interrupt(HV);
2 m) ~% d8 I$ Z4 L3 h/ k: ?3 |    Timer4.setCompare2(40);1 J6 {' E4 @; O/ S5 S
    Timer4.attachCompare2Interrupt(HS);$ X/ E, S9 u( F& ^- _
    Timer4.setCompare3(2140);//2100/ C9 ~( ]- Y8 J
    Timer4.attachCompare3Interrupt(HL);( `$ |, P  r3 `1 ^6 s6 _2 w
    Timer4.setCount(0);8 y; K7 E6 D* d7 V
    Timer4.resume();
- g1 N3 {0 g6 P: _% X}2 ]( z8 X% R+ O8 w- n* ~
void loop() {: v- H  V, I% ]' j$ S0 Y- {; _
  //digitalWrite( LED_PIN,0);delay(500);
) ]5 j% v, k+ K  //digitalWrite( LED_PIN,1);delay(500);
9 }# J$ w# O. n" k" f}
4 f8 l- Y8 E5 F. dvoid HH(void) { VGA_H_HIGH;}! d) n4 [3 d3 L4 Y- f+ W' N* {* U
void HV(void) {. [' h) [) I/ |+ Q7 j
    y++;9 V3 f; K0 |) d' X  w. H9 u3 D* h
    if( y > 523 ) { y = 0;h_active = 1;return;}
) D7 i6 A+ R: o( C* q    if( y > 492 ) { VGA_V_HIGH;return;}
1 t# F' j7 ^7 X    if( y > 490 ) { VGA_V_LOW;return;}: G4 m2 z. T$ l4 [7 p
    if( y > 479 ) { h_active = 0;}
! u3 x0 t8 }6 Q2 u( q3 f* A  |* [& B% @/ h    }
3 a0 @0 b! ], evoid HS(void) {
8 K) P1 T5 s# Z( \) c    VGA_H_HIGH;7 t& p& f( r7 t! l! M' K
    if ( h_active == 0) { return;}
! Q; |4 I3 B+ S2 I/ M: ?! ~    for ( x = 0; x < 22; x++){
% h1 T4 p3 [+ o3 u3 P' f      z=( y / 40 + x) %3;
& a6 W# G! g- w      if ( z == 0){ VGA_B_LOW;VGA_R_HIGH;NOP;NOP;NOP;NOP;NOP;}
5 G( x4 X. v+ K- n2 O; I- Q1 s      if ( z == 1){ VGA_R_LOW;VGA_G_HIGH;}
* Q9 L4 k2 b6 g/ u% O1 Z0 A+ i% l- {/ O      if ( z == 2){ VGA_G_LOW;VGA_B_HIGH;NOP;NOP;& d7 A$ F3 z( d
      NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;}! X. w0 C. G$ {* T3 T% y1 r7 q% p
      NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;4 D  Q) q& b" v) t, U2 e
      NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;1 J; a: k# z2 P3 N. F6 ?
      NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;- v# b( ?0 v& P4 m/ H* a
      NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
4 ?8 y# u9 D* e+ y1 |- P    }' a, m- ^5 b* V6 D5 d. H
    VGA_R_LOW;VGA_G_LOW;VGA_B_LOW;' ^' D  R5 C6 ^% |& ?
    }
* G! U9 E, o# v" l/ Wvoid HL(void) { VGA_H_LOW; }: Y- z& [! a" n+ |2 H0 a8 v" I

' g" O$ @. p# g4 C; J2 x 204123fzz87nq8imqf89fc.jpg
+ }9 F/ N( `% C2 F- x: ^芯片为STM32F103C8T6,参考Crude VGA Output程序。640X480的图像不够细腻,还需改进。今抛砖引玉,望高人赐教。
/ [2 e6 c  _8 }9 Y4 M
% j3 J, s& S- ^

评分

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

查看全部评分

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

举报

4个回答
fanjiezz 回答时间:2016-12-14 22:42:04
网上对STM32F10X系列的RTC时钟有不少的非议,都觉得此类RTC很不准确。前几天有空用此板做了一下试验,觉得还不错。下面先上程序,请各位不吝赐教。) H" n: ?( ]. w9 e$ H1 H1 \8 F5 A
//Analog Input speed test (STM32F103C8T6 AD RTC.ino)
( ]) N; q7 V! s7 T, _#include <RTClock.h>
8 a0 W& s. Q8 {: s% y8 T. L' b#define LED_PIN PC13& _; b+ Z) z9 a  v* a6 w
RTClock rt (RTCSEL_HSE); //RTClock rt (RTCSEL_LSE);; L7 p- ?1 ~: c, w
int i=0,THH,TMM,TSS;
0 l" B3 ~  k. a' J  v) f6 b' p5 w6 Zint sensorPin0 = 0,sensorValue0;//; i' ^2 _9 r% L- C/ }9 H
int sensorPin1 = 1,sensorValue1;) h- i2 l* C% @' L; R
int sensorPin2 = 2,sensorValue2;
% M4 s6 _9 `+ wlong TimeVar;
; _! k- u* ?- x" o8 A; b+ V. Gvoid blink () {* t1 b) W- P( I" b# m
  digitalWrite(LED_PIN,!digitalRead(LED_PIN));
  t( n# c7 j! e' Y  //RTC_GetCounter() % 86400;
) v. J% l$ B2 m/ F  TimeVar=rt.getTime();
4 x8 B0 `! ?1 l: R  if (TimeVar>86399){rtc_set_count(0);}
; G2 d: D* k# m  THH = TimeVar / 3600;// Compute hours
% N) s1 t7 T, E  TMM = TimeVar / 60;1 `# R, a( y) c. }. }1 t' E
  while (TMM>59){TMM=TMM-60;}// Compute minutes
$ X- y3 q, a8 b& o& {( A' P& T2 s  TSS = TimeVar % 60;                          // Compute seconds) l* ^" W( t' q+ ~! g1 Q' G
  Serial.print(THH);Serial.print(":");# B* S" ?1 A- ?: J& k% t
  Serial.print(TMM);Serial.print(":");2 q9 ^$ M1 F/ w- E! a
  Serial.print(TSS);Serial.print("    ");
! n3 [7 Q0 J, w2 ?  Serial.print(sensorValue0);Serial.print("    ");
5 S" O, u; o& [7 Q1 V: Q  Serial.print(sensorValue1);Serial.print("    ");0 T0 C+ _6 e' h, Z& E: S
  Serial.print(sensorValue2);Serial.print("    ");
; @/ t8 E. [. k6 X$ k# k  Serial.println(i);
0 ~( o# L+ v' J. i5 I  i=0;     
  W0 E: `. P$ h$ k, P& N  }4 J' G2 c, {) U4 E8 M
void setup() {6 [" s% D& t/ J' l- B' R, @5 @
  Serial.begin(115200);% B, C% y* o5 A( b* K
  pinMode(LED_PIN, OUTPUT);* r5 _1 F& L4 D# O, {
  //pinMode(sensorPin0, INPUT_ANALOG);
2 K$ B& n- q! e" q1 [4 A5 M  //pinMode(sensorPin1, INPUT_ANALOG);/ b% D0 \! O& {
  //pinMode(sensorPin2, INPUT_ANALOG);        5 x% S$ x, q; X9 ?6 i
  rtc_set_prescaler_load(62500); //rtc_set_prescaler_load(32768);
  Y4 L3 F* K- f0 t& n   rtc_set_count(43199);//11:59:59  o- q% Q8 `$ j( g
  rt.attachSecondsInterrupt(blink);$ W( [! A& v, k0 B
  Serial.println("start");
( F' |! p3 D' O3 z}
* S# M. t3 |# z  ^) B& _" c& wvoid loop() {
/ }) d; {: N- l% N  N6 m, \$ S! l. |  sensorValue0=analogRead(sensorPin0);5 Z% w% {" e- [! `
  sensorValue1=analogRead(sensorPin1);4 V5 s& `* D4 V# F' F
  sensorValue2=analogRead(sensorPin2);  
" ~, L/ L8 F8 E# K8 ?  r  i=i+1;
. \) O: ]! L; s; l! L}
8 P* [- f, ?  x) x! F0 o程序里顺便把AD的读取速度测了。我用的是8M晶振分频方式,也可用32768晶振,即上面标注的LSE方式。原板上的32768晶振有问题,已换掉了。9 d" J. U; p& v/ ^! o: @
zero99 回答时间:2016-12-14 22:21:30
看上去不错
jackten 回答时间:2016-12-15 09:15:29
很好玩的样子                       
Amaker 回答时间:2020-5-26 17:39:32
云里雾里!

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版