FlexʹÓÃ×é¼þ´¦ÀíÊý¾ÝºÍ½»»¥µ¼º½Àà×é¼þ(1)

2. µ¼º½Àà×é¼þ

?

2.1 ToggleButtonBar µ¼º½°´Å¥×é

ToggleButtonBar ÊÇButtonBar µÄ×ÓÀ࣬ÔöÇ¿À´µ¼º½¹¦ÄÜ£¬¿ÉÒÔ³ÖÐø±£³Ö¿Í»§¶Ë״̬¡£

ͬʱÔÚ½çÃæÉ϶Ե±Ç°µÄÑ¡ÖÐ״̬×öÃ÷È·µÄ±êʶ¡£

?

toggleOnClick ÊôÐÔÖ¸Ã÷ÊÇ·ñ¿ÉÒÔͨ¹ýµ¥»÷È¡ÏûÑ¡ÖеÄ״̬¡£true£ºµ±Êó±êµ¥»÷ÒѾ­Ñ¡Öеݴťʱ£¬¸Ã°´Å¥»Ö¸´µ½Õý³£×´Ì¬¡£false£ºÔò²»»á»Ö¸´¡£

?

itemClick="btn_click_handler(event);" ¼àÌýÓû§µÄµ¥»÷¶¯×÷¡£

?

Xml´úÂë icon_copy.gif

  1. ??
  2. <mx:application?xmlns:mx="http: www.adobe.com="" 2006="" mxml"?layout="absolute" ??<="" li="">
  3. ?creationComplete="initUI()">??
  4. ????<mx:style?source="style.css">??
  5. ????<mx:script>??
  6. ????????
  7. ????????????//µ¼Èëµã»÷ʼþ¶ÔÏó ?
  8. ????????????import?mx.events.ItemClickEvent;???????? ?
  9. ????????????internal?function?initUI():void{ ?
  10. ????????????????var?data_arr:Array?=?new?Array(); ?
  11. ????????????????data_arr.push("<span?class=hilite1>Flex"); ?
  12. ????????????????data_arr.push("Flash"); ?
  13. ????????????????data_arr.push("Flash?Media?Server"); ?
  14. ????????????????data_arr.push("<span?class=hilite1>Flex?Data?Server"); ?
  15. ????????????????//Ìí¼ÓÊý¾ÝÔ´ ?
  16. ????????????????btns.dataProvider?=?data_arr; ?
  17. ????????????} ?
  18. ????????????//´¦ÀíitemClickµã»÷ʼþ ?
  19. ????????????internal?function?btn_click_handler(evt:ItemClickEvent):void{ ?
  20. ????????????????tip_txt.text?=?"µã»÷µÄ°´Å¥£º"+evt.index+":"+evt.label; ?
  21. ????????????} ?
  22. ????????]]>??
  23. ????</mx:script>??
  24. ????<mx:togglebuttonbar?toggleonclick="true"?id="btns"?itemclick="btn_click_handler(event);"? ??<="" li="">
  25. horizontalGap="5"?x="22"?y="82">??
  26. ????</mx:togglebuttonbar>??
  27. ???? ??
  28. ????<mx:label?id="tip_txt"?text="»¹Ã»Óеã»÷ÄØ"?x="22"?y="126"?width="266">??
  29. ???? ??
  30. </mx:application>??

<mx:application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" ?creationcomplete="initUI()"> <mx:style source="style.css"> <mx:script> </mx:script> <mx:togglebuttonbar toggleonclick="true" id="btns" itemclick="btn_click_handler(event);" horizontalgap="5" x="22" y="82"> </mx:togglebuttonbar> <mx:label id="tip_txt" text="»¹Ã»Óеã»÷ÄØ" x="22" y="126" width="266"> </mx:application>

?

2.2? TabBar ±êÇ©×é

TabBar ÔÚToggleButtonBar µÄ»ù´¡ÉϼÌÐøÀ©Õ¹£¬¸Ä±äÁ˶ÔÑ¡ÖÐ״̬µÄ±íÏÖÐÎʽ£¬½«Ñ¡ÖÐÏîÒÔ±êÇ©µÄÐÎʽͻ³öÏÔʾ£¬Õâµã¸úTabNavigator Ïàͬ£¬²»¹ýËü²»°üÀ¨ÆäËû×Ó¼¶ÈÝÆ÷¡£

¿ÉºÍÈκÎ×é¼þ½áºÏʹÓ㬶ø²»½ö½öÏÞÓÚÈÝÆ÷¡£

TabBar ±¾ÉíÖ»°üÀ¨ÁËÒ»×é±êÇ©£¬Ã»ÓÐÆäËûÄÚÈÝ¡£

myViewstack.selectedIndex = evt.index;

½«TabBar µÄ°´Å¥Ë÷ÒýºÍViewStack µÄ±»Ñ¡ÖÐÔªËØµÄλÖùØÁªÆðÀ´¡£

Xml´úÂë icon_copy.gif

  1. ??
  2. <mx:application?xmlns:mx="http: www.adobe.com="" 2006="" mxml"?layout="absolute">??
  3. ???? ??
  4. ????<mx:style?source="style.css">??
  5. ????<mx:script>??
  6. ????????
  7. ???????? ?
  8. ????????????import?mx.events.ItemClickEvent;???????? ?
  9. ???????? ?
  10. ????????????internal?function?btn_click_handler(evt:ItemClickEvent):void{ ?
  11. ????????????????myViewstack.selectedIndex?=?evt.index; ?
  12. ????????????} ?
  13. ????????]]>??
  14. ????</mx:script>??
  15. ???? ??
  16. ????<mx:panel?x="43"?y="10"?width="366"?height="310"?layout="absolute"?horizontalgap="0"?verticalgap="0"?title="tabbarʵÀý"?borderstyle="solid">??
  17. ????<mx:tabbar?id="btns"?x="10"?y="10"?width="308"?itemclick="btn_click_handler(event)">??
  18. ????????<mx:dataprovider>??
  19. ????????????<mx:array>??
  20. ????????????????<mx:string><span?class=hilite1>Flex</mx:string>??
  21. ????????????????<mx:string>Flash</mx:string>??
  22. ????????????????<mx:string>FMS</mx:string>??
  23. ????????????????<mx:string>FDS</mx:string>??
  24. ????????????</mx:array>??
  25. ????????</mx:dataprovider>??
  26. ????</mx:tabbar>??
  27. ????<mx:viewstack?x="10"?y="40"?id="myviewstack"?width="308"?height="200">??
  28. ????????<mx:canvas?id="child1"?label="view?1"?width="100%"?height="100%">??
  29. ????????????<mx:list>??
  30. ????????????????<mx:array>??
  31. ????????????????????<mx:object?label="ÇëÑ¡ÔñÄú¸ÐÐËȤµÄ¼¼Êõ£º">?????????????????? ??
  32. ????????????????????<mx:object?label="flash">??
  33. ????????????????????<mx:object?label="<span?class=hilite1>Flex"/>??
  34. ????????????????????<mx:object?label="flash?media?server">??
  35. ????????????????????<mx:object?label="breeze">??
  36. ????????????????</mx:array>??
  37. ????????????</mx:list>??
  38. ????????</mx:canvas>??
  39. ????????<mx:canvas?id="child2"?label="view?2"?width="100%"?height="100%">??
  40. ????????????<mx:textinput?text="ÇëÊäÈëÄúµÄÓÊÏ䵨ַ"?>??
  41. ????????????<mx:button?x="168"?y="1"?label="¶©ÔÄflash?rss">??
  42. ????????</mx:canvas>??
  43. ????????<mx:canvas?id="child3"?label="view?3"?width="100%"?height="100%">??
  44. ????????????<mx:label?text="fms?2.0.4·¢²¼ÁË"?>??
  45. ????????</mx:canvas>??
  46. ????????<mx:canvas?id="child4"?label="view?4"?width="100%"?height="100%">??
  47. ????????????<mx:label?text="breeze"?>??
  48. ????????</mx:canvas>??
  49. ????</mx:viewstack>??
  50. ????</mx:panel>??
  51. ???? ??
  52. </mx:application>??

<mx:application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:style source="style.css"> <mx:script> </mx:script> <mx:panel x="43" y="10" width="366" height="310" layout="absolute" horizontalgap="0" verticalgap="0" title="TabBarʵÀý" borderstyle="solid"> <mx:tabbar id="btns" x="10" y="10" width="308" itemclick="btn_click_handler(event)"> <mx:dataprovider> <mx:array> <mx:string>Flex</mx:string> <mx:string>Flash</mx:string> <mx:string>FMS</mx:string> <mx:string>FDS</mx:string> </mx:array> </mx:dataprovider> </mx:tabbar> <mx:viewstack x="10" y="40" id="myViewstack" width="308" height="200"> <mx:canvas id="child1" label="View 1" width="100%" height="100%"> <mx:list> <mx:array> <mx:object label="ÇëÑ¡ÔñÄú¸ÐÐËȤµÄ¼¼Êõ£º"> <mx:object label="Flash"> <mx:object label="Flex"> <mx:object label="Flash Media server"> <mx:object label="Breeze"> </mx:array> </mx:list> </mx:canvas> <mx:canvas id="child2" label="View 2" width="100%" height="100%"> <mx:textinput text="ÇëÊäÈëÄúµÄÓÊÏ䵨ַ"> <mx:button x="168" y="1" label="¶©ÔÄFlash Rss"> </mx:canvas> <mx:canvas id="child3" label="View 3" width="100%" height="100%"> <mx:label text="FMS 2.0.4·¢²¼ÁË"> </mx:canvas> <mx:canvas id="child4" label="View 4" width="100%" height="100%"> <mx:label text="Breeze"> </mx:canvas> </mx:viewstack> </mx:panel> </mx:application>?

5.3 ʹÓò˵¥µ¼º½ -- ´´½¨Ò»¸ö¼òµ¥µÄ¶à¾Ã²Ëµ¥

ʹÓÃMenuBar ²Ëµ¥Ìõ×÷È«¾Öµ¼º½¡£

ÔÚʹÓÃAS ¶¨ÒåXML Êý¾Ýʱ£¬¿ÉÒÔʹÓû»Ðзû±£³ÖXMLÊý¾ÝµÄ¸ñʽ£¬Ö»ÒªXML µÄ±êÇ©ÕýÈ·£¬±àÒëÆ÷×Ô¶¯»áʶ±ð¡£

ÔÚnode ÔªËØÖÐµÄ enabled ÊôÐÔ ´ú±íÊÇ·ñ¿ÉÓã¬Ä¬ÈÏtrueΪ¿ÉÓã¬falseΪ²»¿ÉÓò˵¥Ïî±ä³É»ÒÉ«¡£

type ÊôÐÔ Îª separator ´ú±íÒ»¸ö·Ö¸îÏß¡£

?

XML ºÍ XMLList ¶¼ÊÇÓÃÀ´¶¨ÒåXML Êý¾Ý£¬²»Í¬µÄÊÇ£¬XMLList ÊǶà¸öXML Êý¾ÝµÄ¼¯ºÏ¡£

ÔÚÕâ¸öÀý×ÓÖУ¬mXMLÊÇXMLListÀàÐÍ£¬¸ù½Úµã±»ºöÂÔ£¬item ½Úµã±»½âÎöΪ¶ÀÁ¢µÄ XML Êý¾Ý¡£ item ½Úµã±ØÐëÓÐÒ»¸ö¸ù½Úµã£¬²»¿ÉºöÂÔ¡£

Xml´úÂë icon_copy.gif

  1. ??
  2. <mx:application?xmlns:mx="http: www.adobe.com="" 2006="" mxml"?layout="absolute" ?creationcomplete="initApp()">??
  3. ???? ??
  4. ????<mx:style?source="style.css">???????????? ??
  5. ????<mx:script>??
  6. ????????
  7. ????????????import?mx.controls.Alert;??????? ?
  8. ????????????import?mx.events.MenuEvent; ?
  9. ???????????? ?
  10. ????????????private?var?mXML:XML?= ?
  11. ????????????????<menu?label?=?"ϵͳ²Ëµ¥"> ?
  12. ????????????????????<item?label="Îļþ"> ?
  13. ????????????????????????<node?label="н¨»­°å"?data="new"> ?
  14. ????????????????????????<node?label="Çå³ý»­°å"?data="clear"?enabled="false"> ?
  15. ????????????????????????<node?type="separator"?> ?
  16. ????????????????????????<node?label="Í˳öϵͳ"?data="logout"> ?
  17. ????????????????????</item> ?
  18. ????????????????????<item?label="°ïÖú"> ?
  19. ????????????????????????<node?label="°ïÖú"?data="help"> ?
  20. ????????????????????????<node?label="¹ØÓÚ×÷Õß"?data="about"> ?
  21. ?????????????????????</item> ?
  22. ????????????????; ?
  23. ???????????? ?
  24. ????????????internal?function?initApp():void{ ?
  25. ????????????????//ΪMenuBarÌí¼ÓÊý¾ÝÔ´ ?
  26. ????????????????myMenu.dataProvider?=?mXML; ?
  27. ????????????????//¼àÌýMenuµÄµã»÷ʵ¼ù ?
  28. ????????????????myMenu.addEventListener(MenuEvent.ITEM_CLICK,menuClickHandler); ?
  29. ????????????} ?
  30. ???????????? ?
  31. ????????????internal?function?menuClickHandler(evt:MenuEvent):void{ ?
  32. ????????????????Alert.show("Ñ¡Ôñ²Ëµ¥£º"+evt.item.@data,"ÌáʾÐÅÏ¢"); ?
  33. ????????????} ?
  34. ????????]]>??
  35. ????</mx:script>??
  36. ????<mx:vbox?width="100%"?height="100%">??
  37. ????????<mx:canvas?stylename="windowbar"?width="100%">??
  38. ????????????<mx:menubar?labelfield="@label"??height="30"?id="mymenu"?width="100%"></mx:menubar>? ??
  39. ????????</mx:canvas>??
  40. ????????<mx:canvas?width="100%"?height="100%"?id="paper">??
  41. ???????????? ??
  42. ????????</mx:canvas>?????????? ??
  43. ????</mx:vbox>??
  44. ???? ??
  45. </mx:application>??

<mx:application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationcomplete="initApp()"> <mx:style source="style.css"> <mx:script> <item label="Îļþ"> <node label="н¨»­°å" data="new"> <node label="Çå³ý»­°å" data="clear" enabled="false"> <node type="separator"> <node label="Í˳öϵͳ" data="logout"> </item> <item label="°ïÖú"> <node label="°ïÖú" data="help"> <node label="¹ØÓÚ×÷Õß" data="about"> </item> ; internal function initApp():void{ //ΪMenuBarÌí¼ÓÊý¾ÝÔ´ myMenu.dataProvider = mXML; //¼àÌýMenuµÄµã»÷ʵ¼ù myMenu.addEventListener(MenuEvent.ITEM_CLICK,menuClickHandler); } internal function menuClickHandler(evt:MenuEvent):void{ Alert.show("Ñ¡Ôñ²Ëµ¥£º"+evt.item.@data,"ÌáʾÐÅÏ¢"); } ]]> </mx:script> <mx:vbox width="100%" height="100%"> <mx:canvas stylename="windowBar" width="100%"> <mx:menubar labelfield="@label" height="30" id="myMenu" width="100%"></mx:menubar> </mx:canvas> <mx:canvas width="100%" height="100%" id="paper"> </mx:canvas> </mx:vbox> </mx:application>?

2.4 PopUpButton ÏÂÀ­µ¯³ö´°¿Ú¿Ø¼þ

PopUpButton ÊÇÒ»¸öÌØÊâµÄButton£¬ ±¾ÉíÓÉÁ½¸öButton×é³É£ºÖ÷°´Å¥ºÍ×Ó°´Å¥¡£µã»÷×Ó°´Å¥¿ÉÒÔ½«ÈκÎ×é¼þ×÷Ϊ´°¿Úµ¯³ö£¬ÖÃÓÚ×îÉϲ㡣Õâ¸öµ¯³ö¶¯×÷ÓÉ PopUpMenuButton Íê³É¡£

PopUpButton µÄopen ʼþºÍ close ʼþ£ºµ¯³öºÍµ¯³ö´°¿Ú¹Ø±Õʱ´¥·¢¡£

popUp ÊôÐÔ£º½«Òªµ¯³öµÄ¶ÔÏó¡£

DropdownEvent.CLOSE ºÍ DropdownEvent.OPEN ʼþרÃÅÕë¶Ôµ¯³ö´°¿Ú¡£µã»÷Ö÷°´Å¥£¬´¥·¢µÄʼþºÍButton ÊÇÒ»ÑùµÄ£¬±ÈÈçclick¡£

?

Xml´úÂë icon_copy.gif

  1. ??
  2. <mx:application?xmlns:mx="http: www.adobe.com="" 2006="" mxml"?creationcomplete="initApp()" ?layout="absolute">??
  3. ????<mx:style>??
  4. ????????Application{ ??
  5. ????????????fontSize:12; ??
  6. ????????????backgroundGradientColors:?#c0c0c0,?#c0c0c0; ??
  7. ????????} ??
  8. ????</mx:style>??
  9. ????<mx:script>??
  10. ????????
  11. ????????????import?mx.containers.Panel;????? ?
  12. ????????????import?mx.controls.Alert;??? ?
  13. ????????????import?mx.events.DropdownEvent; ?
  14. ?
  15. ????????????private?var?panel:Panel; ?
  16. ?
  17. ????????????private?function?initApp():void?{ ?
  18. ????????????????panel?=?new?Panel();??//ÉùÃ÷еÄPanel ?
  19. ????????????????panel.title?=?"panel"; ?
  20. ????????????????panel.width?=?200; ?
  21. ????????????????panel.height?=?200; ?
  22. ????????????????popBtn.popUp?=?panel;???????????//Ö¸¶¨popUpÄ¿±ê¶ÔÏó??????? ?
  23. ????????????????popBtn.addEventListener(DropdownEvent.CLOSE,closeHandler);??//?????????? ?
  24. ????????????????popBtn.open();??????//½«´°¿Úµ¯³ö ?
  25. ????????????}??????????? ?
  26. ?
  27. ???????????? ?
  28. ????????????private?function?closeHandler(evt:DropdownEvent):void{ ?
  29. ????????????????Alert.show("¹Ø±Õ´°¿Ú"); ?
  30. ????????????} ?
  31. ????????]]>??
  32. ????</mx:script>??
  33. ????<mx:popupbutton?id="popbtn"?label="µ¯³ö"?width="135"??x="23"?y="23">??
  34. ???? ??
  35. </mx:application>??

<mx:application xmlns:mx="http://www.adobe.com/2006/mxml" creationcomplete="initApp()" layout="absolute"> <mx:style> Application{ fontSize:12; backgroundGradientColors: #c0c0c0, #c0c0c0; } </mx:style> <mx:script> </mx:script> <mx:popupbutton id="popBtn" label="µ¯³ö" width="135" x="23" y="23"> </mx:application>?

2.5 PopUpMenuButton

¼Ì³Ð×ÔPopUpButton£¬ÊÇ PopUpButtonµÄÒ»¸öÌØÊâʵÀý¡£Ö»ÄܰÑMenu µ±×÷µ¯³ö´°¿Ú£¬ÇÒMenu Ö»ÄÜÓÐ1¸ø²ã¼¶¡£

Menu ÓÃÀ´´´½¨²Ëµ¥£¬²»¹ýºÍ MenuÏà±È£¬ËüÉÙÁ˲˵¥Ìõ¡£ÇÒûÓжÔÓ¦µÄMXML±êÇ©£¬Ö»ÄÜÓÉ´úÂë´´½¨¡£

PopUpMenuButton ÖÐÄÚÖÃÁËÒ»¸öMenu ¡£

¶¨ÒåXML Êý¾Ý£¬½«Ëü´«¸ø PopUpMenuButton µÄ dataProvider £¬×÷ΪÄÚÖõÄMenu µÄÊý¾ÝÔ´¡£

MenuEvent.ITEM_CLICK ʼþ£ºµ±²Ëµ¥ÏѡÖÐʱ£¬Ê¼þ±»´¥·¢£¬Í¬Ê±²Ëµ¥¹Ø±Õ¡£

Xml´úÂë icon_copy.gif

  1. ??
  2. <mx:application?xmlns:mx="http: www.adobe.com="" 2006="" mxml"?creationcomplete="initApp()" ?layout="absolute">??
  3. ????<mx:style>??
  4. ????????Application{ ??
  5. ????????????fontSize:12; ??
  6. ????????????backgroundGradientColors:?#c0c0c0,?#c0c0c0; ??
  7. ????????} ??
  8. ????</mx:style>??
  9. ????<mx:script>??
  10. ????????
  11. ????????????import?mx.controls.Alert;??? ?
  12. ????????????import?mx.events.MenuEvent; ?
  13. ???????????? ?
  14. ????????????private?var?mXML:XMLList?= ?
  15. ????????????????<> ?
  16. ????????????????????<node?label="Îļþ"> ?
  17. ????????????????????????<node?label="н¨»­°å"?data="new"> ?
  18. ????????????????????????<node?label="Çå³ý»­°å"?data="clear"?enabled="false"> ?
  19. ????????????????????????<node?label="Í˳öϵͳ"?data="logout"> ?
  20. ????????????????????</node> ?
  21. ????????????????????<node?label="¹¤¾ß">???????????????????????? ?
  22. ????????????????????<node?label="°ïÖú"> ?
  23. ????????????????????????<node?label="°ïÖú"?data="help"> ?
  24. ????????????????????????<node?label="¹ØÓÚ×÷Õß"?data="about"> ?
  25. ?????????????????????</node> ?
  26. ????????????????; ?
  27. ????????????private?function?initApp():void?{ ?
  28. ????????????????popBtn.dataProvider?=?mXML;?//µ¯³ö²Ëµ¥µÄÊý¾ÝÔ´ ?
  29. ????????????????popBtn.addEventListener(MenuEvent.ITEM_CLICK,clickHandler);? ?
  30. ????????????}??????????? ?
  31. ????????????private?function?clickHandler(evt:MenuEvent):void{ ?
  32. ????????????????Alert.show("Ñ¡Ôñ²Ëµ¥£º"+evt.label+":²Ëµ¥ÐòºÅ£º"+evt.index); ?
  33. ????????????} ?
  34. ????????]]>??
  35. ????</mx:script>??
  36. ????<mx:popupmenubutton?id="popbtn"?labelfield="@label"?width="135"??x="23"?y="23">??
  37. ???? ??
  38. </mx:application>??

1.8 DataGrid ×é¼þ -- ÖÆ×÷ͼÊéÑ¡¹ºÁбí

DataGrid×é¼þµÄ×÷ÓúÍHTMLÒ³ÃæÖеıí¸ñÀàËÆ£¬½«Êý¾ÝÒÔÐС¢ÁеĸñʽÏÔʾ³öÀ´¡£

?

ÿһ×ÝÁеĿí¶È²»¶¨£¬Óû§¿ÉÒÔÔÚÔËÐÐʱµ÷Õû¿í¶È¡£

¿ÉÔÚÔËÐÐʱµ÷ÕûÁеÄ˳Ðò

µã»÷ÁбêÌâÀ¸¿É¶ÔÁÐÊý¾Ý½øÐÐÅÅÐò

¿ÉÒÔ×Ô¶¨ÒåÿÁеıêÌâÀ¸

ºÍList×é¼þÒ»Ñù£¬¿ÉÒÔ×Ô¶¨Òåÿ¸öµ¥Ôª¸ñµÄitemRenderer

?

ʹÓÃModel¶¨ÒåÊý¾ÝÔ´£¬

columns ¶¨ÒåÁËËùÓеÄÁУ¬ÆäÖÐDataGridColumn ´ú±íÒ»ÁеÄÐÅÏ¢£¬dataFieldµÄÖµ²»¿ÉÊ¡ÂÔ£¬Õâ¸öÖµ±ØÐëÊÇÊý¾ÝÔ´ÖÐÿÌõÊý¾Ý°üº¬µÄÊôÐÔÃû£¬·ñÔòÎÞ·¨ÏÔʾ¡£headerText ±íʾÁбêÌâ¡£

rowCount ±íʾÏÔʾµÄÐÐÊý£¬Èç¹ûheightûÓÐÉèÖã¬ÔòÓÃÕâ¸öÊôÐÔÀ´¼¼Êõ¸ß¶È¡£height=rowCount*rowHeightÐиߡ£

selectedItem ÊôÐÔ´ú±íµ±Ç°Ñ¡ÖÐÐеÄÊý¾Ý£¬¿ÉÒÔÔÚÊý¾Ý°ó¶¨ÖУ¬µ±ËüµÄÖµ·¢Éú±ä»¯Ê±£¬Ê¹ÓøÃÊôÐÔµÄÈκÎÎï¼þ¶¼»á×Ô¶¯¸üС£

?

½Ó×ÅÎÒÃÇÀûÓÃitemRenderer ÔÚDataGridÖмÓÈ븴ѡ¿ò´´½¨×é¼þ£º

ÔÚ×é¼þÖÐÌí¼ÓÒ»¸ö¸´Ñ¡¿ò¡£²¢Ìí¼ÓchangeʼþµÄ·½·¨addCart¡£

this.parentApplication ±íʾ¸¸Application£¬¾ÍÊÇÎÒÃǺóÃæÊ¹ÓøÃ×é¼þµÄApplication¡£

new cartEvent(data,cart_check.selected)

addCart ·½·¨´´½¨ÁËÒ»¸ö×Ô¶¨Òåʼþ cartEvent ʼþ£¬²¢ÇÒ½«±ØÒªµÄÊôÐÔ´«µ½¸Ãʼþ£¬

È»ºóͨ¹ý dispatchEvent ÅÉ·¢¸Ãʼþ¡£

?

Xml´úÂë icon_copy.gif

  1. ??
  2. <mx:canvas?xmlns:mx="http: www.adobe.com="" 2006="" mxml"="">??
  3. ????<mx:script>??
  4. ????????
  5. ????????????import?bookEvent.cartEvent; ?
  6. ????????????internal?function?addCart():void{ ?
  7. ????????????????this.parentApplication.dispatchEvent(new?cartEvent(data,cart_check.selected)); ?
  8. ????????????} ?
  9. ????????]]>??
  10. ????</mx:script>??
  11. ????<mx:checkbox?id="cart_check"?x="0"?y="0"?label="¹ºÂò"?change="addcart()">??
  12. </mx:canvas>??

<mx:canvas xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:script> </mx:script> <mx:checkbox id="cart_check" x="0" y="0" label="¹ºÂò" change="addCart()"></mx:canvas>

ÒÔÏÂΪ¶¨ÒåÒ»¸öcartEvent ʼþÀࣺ

ËùÓеÄʼþ¼Ì³ÐEvent£¬ ÔÚ¹¹Ô캯ÊýÖж¨ÒåÁËÁ½¸ö²ÎÊý£º_data ºÍ _isAdd£¬´´½¨Ê¼þµÄʱºò£¬½«Í¨¹ýÕâÁ½¸ö²ÎÊý½«ÐÅÏ¢´«ÈëʼþÖС£

super("AddBook") µ÷Óø¸ÀàEvent µÄ¹¹Ô캯Êý£¬²¢°ÑʼþÀàÐÍ¡°AddBook¡±´«µÝ¹ýÈ¥¡£Ö»Óе÷ÓÃÁ˸¸ÀàµÄ¹¹Ô캯Êý£¬²ÅÄܳÉÎªÕæÕýµÄʼþ¶ÔÏó¡£

Xml´úÂë icon_copy.gif

  1. package?bookEvent ??
  2. { ??
  3. ????import?flash.events.Event; ??
  4. ??
  5. ????public?class?cartEvent?extends?Event{ ??
  6. ????????public?var?isAdd:Boolean; ??
  7. ????????public?var?book:Object; ??
  8. ????????function?cartEvent(_data:Object,_isAdd:Boolean):void{ ??
  9. ????????????isAdd?=?_isAdd; ??
  10. ????????????book?=?_data; ??
  11. ???????????? ??
  12. ????????????super("AddBook"); ??
  13. ????????} ??
  14. ????} ??
  15. }??

package bookEvent{ import flash.events.Event; public class cartEvent extends Event{ public var isAdd:Boolean; public var book:Object; function cartEvent(_data:Object,_isAdd:Boolean):void{ isAdd = _isAdd; book = _data; super("AddBook"); } }}?

½ÓÏÂÀ´ÊÇÖ÷³ÌÐò¡£

ÔÚ³ÌÐò³õʼ»¯º¯ÊýÖУ¬addEventListener("AddBook",AddHandler) Ϊµ±Ç°¶ÔÏóÌí¼ÓÁ˶ÔAddBookʼþµÄ¼àÌý¡£

Xml´úÂë icon_copy.gif

  1. ??
  2. <mx:application?xmlns:mx="http: www.adobe.com="" 2006="" mxml"?fontsize="12" ?creationcomplete="initApp()">??
  3. ????????<mx:script>??
  4. ????????????
  5. ????????????????import?mx.events.DataGridEvent; ?
  6. ????????????????import?mx.events.DataGridEventReason ?
  7. ????????????????import?bookEvent.cartEvent; ?
  8. ????????????????import?view.*; ?
  9. ???????????????? ?
  10. ????????????????internal?function?initApp():void{ ?
  11. ????????????????????addEventListener("AddBook",AddHandler); ?
  12. ????????????????} ?
  13. ????????????????internal?function?AddHandler(evt:cartEvent):void{ ?
  14. ????????????????????if(evt.isAdd){ ?
  15. ????????????????????????tip_txt.text?=?"ÄãÑ¡Ôñ¹ºÂò£º"+evt.book.name; ?
  16. ????????????????????}else{ ?
  17. ????????????????????????tip_txt.text?=?"Äã·ÅÆú¹ºÂò£º"+evt.book.name; ?
  18. ????????????????????} ?
  19. ????????????????} ?
  20. ???????????????? ?
  21. ????????????????internal?function?checkInfo(evt:DataGridEvent):void{ ?
  22. ????????????????????//Èç¹ûûÓÐ×÷ÐÞ¸Ä ?
  23. ????????????????????if?(evt.reason?==?DataGridEventReason.CANCELLED){ ?
  24. ????????????????????????return; ?
  25. ????????????????????} ?
  26. ????????????????????//È·¶¨Ð޸ĵÄÊôÐÔ ?
  27. ????????????????????if(evt.dataField?==?"date"){ ?
  28. ????????????????????????//?Çå³ýÔ­À´µÄÊý¾Ý ?
  29. ????????????????????????evt.preventDefault(); ?
  30. ????????????????????????//?µÃµ½ÐµÄÊý¾Ý ?
  31. ????????????????????????book_DG.editedItemRenderer.data.date?=?dateCell(DataGrid(evt.target).itemEditorInstance).num_year.value; ?
  32. ????????????????????????//?¹Ø±Õitem?editor ?
  33. ????????????????????????book_DG.destroyItemEditor();? ?
  34. ????????????????????????//¸üÐÂÊý¾ÝÔ´? ?
  35. ????????????????????????book_DG.dataProvider.itemUpdated(evt.itemRenderer.data); ?
  36. ????????????????????} ?
  37. ????????????????} ?
  38. ????????????]]>??
  39. ????????</mx:script>??
  40. ????????<mx:model?id="books">??
  41. ????????????<datas>??
  42. ????????????????<book>??
  43. ????????????????????<name>FlashµÚÒ»²½</name>??
  44. ????????????????????<author>³Â±ù</author>??
  45. ????????????????????<date>2006</date>??
  46. ????????????????</book>??
  47. ????????????????<book>??
  48. ????????????????????<name>FlexµÚÒ»²½</name>??
  49. ????????????????????<author>walktree</author>??
  50. ????????????????????<date>2007</date>??
  51. ????????????????</book>??
  52. ????????????????<book>??
  53. ????????????????????<name>ApolloµÚÒ»²½</name>??
  54. ????????????????????<author>»¹²»ÖªµÀÄØ</author>??
  55. ????????????????????<date>2008</date>??
  56. ????????????????</book>??
  57. ????????????</datas>??
  58. ????????</mx:model>???? ??
  59. ????????<mx:label?width="100%"?color="#004080"?text="Ñ¡ÔñÒ»±¾Ê鹺Âò">??
  60. ????????<mx:datagrid?editable="true"?id="book_dg"?width="100%"?height="156"?itemeditend="checkinfo(event)"?rowcount="5"?dataprovider="{books.book}">??
  61. ????????????<mx:columns>??
  62. ????????????????<mx:datagridcolumn?datafield="name"?headertext="ÊéÃû">??
  63. ????????????????<mx:datagridcolumn?datafield="author"?headertext="×÷Õß">??
  64. ????????????????<mx:datagridcolumn?datafield="date"?headertext="³ö°æÈÕÆÚ"?itemeditor="view.datecell"?>??
  65. ????????????????<mx:datagridcolumn?headertext="¹ºÂò"?itemrenderer="view.cartcell"?editable="false">??
  66. ????????????</mx:columns>??
  67. ????????</mx:datagrid>??
  68. ???????? ??
  69. ????????<mx:canvas?height="150"?width="100%"?backgroundcolor="#ffffff">??
  70. ????????<mx:label?id="tip_txt"?text="»¹Ã»ÓÐÑ¡ÔñÊéÄ¿">??? ??
  71. ????????</mx:canvas>??
  72. ??
  73. </mx:application>??

<mx:application xmlns:mx="http://www.adobe.com/2006/mxml" fontsize="12" creationcomplete="initApp()"> <mx:script> </mx:script> <mx:model id="books"> <datas> <book> <name>FlashµÚÒ»²½</name> <author>³Â±ù</author> <date>2006</date> </book> <book> <name>FlexµÚÒ»²½</name> <author>walktree</author> <date>2007</date> </book> <book> <name>ApolloµÚÒ»²½</name> <author>»¹²»ÖªµÀÄØ</author> <date>2008</date> </book> </datas> </mx:model> <mx:label width="100%" color="#004080" text="Ñ¡ÔñÒ»±¾Ê鹺Âò"> <mx:datagrid editable="true" id="book_DG" width="100%" height="156" itemeditend="checkInfo(event)" rowcount="5" dataprovider="{books.book}"> <mx:columns> <mx:datagridcolumn datafield="name" headertext="ÊéÃû"> <mx:datagridcolumn datafield="author" headertext="×÷Õß"> <mx:datagridcolumn datafield="date" headertext="³ö°æÈÕÆÚ" itemeditor="view.dateCell"> <mx:datagridcolumn headertext="¹ºÂò" itemrenderer="view.cartCell" editable="false"> </mx:columns> </mx:datagrid> <mx:canvas height="150" width="100%" backgroundcolor="#ffffff"> <mx:label id="tip_txt" text="»¹Ã»ÓÐÑ¡ÔñÊéÄ¿"> </mx:canvas></mx:application>

?

´ËÍ⻹ÓÐheaderRenderer ¿ØÖƱêÌâÀ¸µÄ½çÃæ ºÍ itemEditor ¿ØÖƵ¥Ôª¸ñÖб༭״̬ϵĽçÃæ£¬Ê¹ÓøúitemRendererÒ»Ñù¡£ÒªÊ¹ÓÃitemEditor±ØÐ뽫DataGrid µÄeditable ÊôÐÔÉèΪtrue¡£»¹ÒªÉèÖú¯ÊýÀ´´¦Àí±à¼­Íê³Éʼþ£¬¸üÐÂÊý¾Ý¡£Ö÷³ÌÐò´úÂë¼ûÉÏÃæ ¡£

?

½Ó×ÅÎÒÃÇÔÙ¶¨ÒåÒ»¸ö×é¼þ£º

ÔÚÏÂÃæµÄ×é¼þÖУ¬Ê¹ÓÃÁËNumericStepper Êý×ÖÑ¡Ôñ¿Ø¼þÀ´Ìṩ±ã½Ý²Ù×÷¡£

ÔÚÓû§Íê³É±à¼­µ¥Ôª¸ñÊý¾Ýºó£¬itemEditEndʼþ½«±»´¥·¢£¬DataGridEvent ʼþ±»ÅÉ·¢³öÈ¥£¬Òò´ËʹÓüàÌýº¯Êý£ºitemEditEnd="checkInfo(event)"

if (evt.reason == DataGridEventReason.CANCELLED) ¼ì²éʼþµÄÀàÐÍ

Xml´úÂë icon_copy.gif

  1. ??
  2. <mx:canvas?xmlns:mx="http: www.adobe.com="" 2006="" mxml"?width="180">??
  3. ????<mx:numericstepper?id="num_year"?x="0"?y="0"?minimum="1900"?maximum="2100"?value="{data.date}">??
  4. ????<mx:label?text="ÇëÑ¡ÔñÄê·Ý"?x="96"?y="2">??
  5. </mx:canvas>??

/** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú³õÊ&frac14;»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf * @license Copyright (c) 2020-2032, &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë¾ **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * &frac14;&frac14;ÊõÂÛ̳:www.openedv.com * &sup1;«Ë¾ÍøÖ·:www.alientek.com * &sup1;ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢²&frac14; * V1.1 20230605 * ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç&sup1;ûÊ&sup1;ÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os Ê&sup1;Óà */ #endif /******************************************************************************************/ /* &frac14;ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* Ê&sup1;ÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñÊ&frac12;£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* Ê&sup1;ÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* ²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ&frac14;æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ&sup1;ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR&frac14;Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç&sup1;ûÊ&sup1;ÄÜÁË&frac12;ÓÊÕ */ /* &frac12;ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* &frac12;ÓÊÕ״̬ * bit15£¬ &frac12;ÓÊÕÍê³É±êÖ¾ * bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d * bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âÊ&sup1;ÓõĴ®¿Ú&frac12;ÓÊÕ»º³å */ UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */ /** * @brief ´®¿ÚX³õÊ&frac14;»¯º¯Êý * @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô&frac14;ºÐèÒªÉèÖò¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾ­ÉèÖÃ&sup1;ýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñÊ&frac12; */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öÍ£Ö&sup1;λ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ&frac14;УÑéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²&frac14;þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áÊ&sup1;ÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º³åÒÔ&frac14;°&frac12;ÓÊÕ»º³å&frac12;ÓÊÕ×î´óÊý¾ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×²ã³õÊ&frac14;»¯º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê³ÉʱÖÓÊ&sup1;ÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP³õÊ&frac14;»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓÊ&sup1;ÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý&frac12;Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õÊ&frac14;»¯·¢ËÍÒý&frac12;Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý&frac12;Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õÊ&frac14;»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* Ê&sup1;ÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3£¬×ÓÓÅÏÈ&frac14;¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* &frac12;ÓÊÕδÍê³É */ { if(g_usart_rx_sta & 0x4000) /* &frac12;ÓÊÕµ&frac12;ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê³ÉÁË */ } } else /* »&sup1;ûÊÕµ&frac12;0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ&frac14;&frac12;ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí&sup1;«Óú¯Êý */ #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú³õÊ&frac14;»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf * @license Copyright (c) 2020-2032, &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë¾ **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * &frac14;&frac14;ÊõÂÛ̳:www.openedv.com * &sup1;«Ë¾ÍøÖ·:www.alientek.com * &sup1;ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢²&frac14; * V1.1 20230605 * ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç&sup1;ûÊ&sup1;ÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os Ê&sup1;Óà */ #endif /******************************************************************************************/ /* &frac14;ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* Ê&sup1;ÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñÊ&frac12;£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* Ê&sup1;ÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* ²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ&frac14;æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ&sup1;ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR&frac14;Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç&sup1;ûÊ&sup1;ÄÜÁË&frac12;ÓÊÕ */ /* &frac12;ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* &frac12;ÓÊÕ״̬ * bit15£¬ &frac12;ÓÊÕÍê³É±êÖ¾ * bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d * bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âÊ&sup1;ÓõĴ®¿Ú&frac12;ÓÊÕ»º³å */ UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */ /** * @brief ´®¿ÚX³õÊ&frac14;»¯º¯Êý * @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô&frac14;ºÐèÒªÉèÖò¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾ­ÉèÖÃ&sup1;ýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñÊ&frac12; */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öÍ£Ö&sup1;λ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ&frac14;УÑéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²&frac14;þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áÊ&sup1;ÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º³åÒÔ&frac14;°&frac12;ÓÊÕ»º³å&frac12;ÓÊÕ×î´óÊý¾ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×²ã³õÊ&frac14;»¯º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê³ÉʱÖÓÊ&sup1;ÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP³õÊ&frac14;»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓÊ&sup1;ÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý&frac12;Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õÊ&frac14;»¯·¢ËÍÒý&frac12;Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý&frac12;Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õÊ&frac14;»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* Ê&sup1;ÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3£¬×ÓÓÅÏÈ&frac14;¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* &frac12;ÓÊÕδÍê³É */ { if(g_usart_rx_sta & 0x4000) /* &frac12;ÓÊÕµ&frac12;ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê³ÉÁË */ } } else /* »&sup1;ûÊÕµ&frac12;0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ&frac14;&frac12;ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí&sup1;«Óú¯Êý */ #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú³õÊ&frac14;»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf * @license Copyright (c) 2020-2032, &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë¾ **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * &frac14;&frac14;ÊõÂÛ̳:www.openedv.com * &sup1;«Ë¾ÍøÖ·:www.alientek.com * &sup1;ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢²&frac14; * V1.1 20230605 * ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç&sup1;ûÊ&sup1;ÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os Ê&sup1;Óà */ #endif /******************************************************************************************/ /* &frac14;ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* Ê&sup1;ÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñÊ&frac12;£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* Ê&sup1;ÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* ²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ&frac14;æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ&sup1;ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR&frac14;Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç&sup1;ûÊ&sup1;ÄÜÁË&frac12;ÓÊÕ */ /* &frac12;ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* &frac12;ÓÊÕ״̬ * bit15£¬ &frac12;ÓÊÕÍê³É±êÖ¾ * bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d * bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âÊ&sup1;ÓõĴ®¿Ú&frac12;ÓÊÕ»º³å */ UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */ /** * @brief ´®¿ÚX³õÊ&frac14;»¯º¯Êý * @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô&frac14;ºÐèÒªÉèÖò¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾ­ÉèÖÃ&sup1;ýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñÊ&frac12; */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öÍ£Ö&sup1;λ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ&frac14;УÑéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²&frac14;þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áÊ&sup1;ÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º³åÒÔ&frac14;°&frac12;ÓÊÕ»º³å&frac12;ÓÊÕ×î´óÊý¾ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×²ã³õÊ&frac14;»¯º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê³ÉʱÖÓÊ&sup1;ÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP³õÊ&frac14;»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓÊ&sup1;ÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý&frac12;Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õÊ&frac14;»¯·¢ËÍÒý&frac12;Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý&frac12;Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õÊ&frac14;»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* Ê&sup1;ÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3£¬×ÓÓÅÏÈ&frac14;¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* &frac12;ÓÊÕδÍê³É */ { if(g_usart_rx_sta & 0x4000) /* &frac12;ÓÊÕµ&frac12;ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê³ÉÁË */ } } else /* »&sup1;ûÊÕµ&frac12;0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ&frac14;&frac12;ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí&sup1;«Óú¯Êý */ #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú³õÊ&frac14;»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf * @license Copyright (c) 2020-2032, &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë¾ **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * &frac14;&frac14;ÊõÂÛ̳:www.openedv.com * &sup1;«Ë¾ÍøÖ·:www.alientek.com * &sup1;ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢²&frac14; * V1.1 20230605 * ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç&sup1;ûÊ&sup1;ÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os Ê&sup1;Óà */ #endif /******************************************************************************************/ /* &frac14;ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* Ê&sup1;ÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñÊ&frac12;£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* Ê&sup1;ÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* ²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ&frac14;æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ&sup1;ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR&frac14;Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç&sup1;ûÊ&sup1;ÄÜÁË&frac12;ÓÊÕ */ /* &frac12;ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* &frac12;ÓÊÕ״̬ * bit15£¬ &frac12;ÓÊÕÍê³É±êÖ¾ * bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d * bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âÊ&sup1;ÓõĴ®¿Ú&frac12;ÓÊÕ»º³å */ UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */ /** * @brief ´®¿ÚX³õÊ&frac14;»¯º¯Êý * @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô&frac14;ºÐèÒªÉèÖò¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾ­ÉèÖÃ&sup1;ýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñÊ&frac12; */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öÍ£Ö&sup1;λ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ&frac14;УÑéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²&frac14;þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áÊ&sup1;ÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º³åÒÔ&frac14;°&frac12;ÓÊÕ»º³å&frac12;ÓÊÕ×î´óÊý¾ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×²ã³õÊ&frac14;»¯º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê³ÉʱÖÓÊ&sup1;ÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP³õÊ&frac14;»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓÊ&sup1;ÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý&frac12;Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õÊ&frac14;»¯·¢ËÍÒý&frac12;Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý&frac12;Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õÊ&frac14;»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* Ê&sup1;ÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3£¬×ÓÓÅÏÈ&frac14;¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* &frac12;ÓÊÕδÍê³É */ { if(g_usart_rx_sta & 0x4000) /* &frac12;ÓÊÕµ&frac12;ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê³ÉÁË */ } } else /* »&sup1;ûÊÕµ&frac12;0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ&frac14;&frac12;ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí&sup1;«Óú¯Êý */ #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú³õÊ&frac14;»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf * @license Copyright (c) 2020-2032, &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë¾ **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * &frac14;&frac14;ÊõÂÛ̳:www.openedv.com * &sup1;«Ë¾ÍøÖ·:www.alientek.com * &sup1;ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢²&frac14; * V1.1 20230605 * ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç&sup1;ûÊ&sup1;ÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os Ê&sup1;Óà */ #endif /******************************************************************************************/ /* &frac14;ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* Ê&sup1;ÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñÊ&frac12;£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* Ê&sup1;ÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* ²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ&frac14;æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ&sup1;ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR&frac14;Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç&sup1;ûÊ&sup1;ÄÜÁË&frac12;ÓÊÕ */ /* &frac12;ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* &frac12;ÓÊÕ״̬ * bit15£¬ &frac12;ÓÊÕÍê³É±êÖ¾ * bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d * bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âÊ&sup1;ÓõĴ®¿Ú&frac12;ÓÊÕ»º³å */ UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */ /** * @brief ´®¿ÚX³õÊ&frac14;»¯º¯Êý * @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô&frac14;ºÐèÒªÉèÖò¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾ­ÉèÖÃ&sup1;ýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñÊ&frac12; */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öÍ£Ö&sup1;λ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ&frac14;УÑéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²&frac14;þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áÊ&sup1;ÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º³åÒÔ&frac14;°&frac12;ÓÊÕ»º³å&frac12;ÓÊÕ×î´óÊý¾ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×²ã³õÊ&frac14;»¯º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê³ÉʱÖÓÊ&sup1;ÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP³õÊ&frac14;»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓÊ&sup1;ÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý&frac12;Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õÊ&frac14;»¯·¢ËÍÒý&frac12;Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý&frac12;Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õÊ&frac14;»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* Ê&sup1;ÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3£¬×ÓÓÅÏÈ&frac14;¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* &frac12;ÓÊÕδÍê³É */ { if(g_usart_rx_sta & 0x4000) /* &frac12;ÓÊÕµ&frac12;ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê³ÉÁË */ } } else /* »&sup1;ûÊÕµ&frac12;0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ&frac14;&frac12;ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí&sup1;«Óú¯Êý */ #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú³õÊ&frac14;»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf * @license Copyright (c) 2020-2032, &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë¾ **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * &frac14;&frac14;ÊõÂÛ̳:www.openedv.com * &sup1;«Ë¾ÍøÖ·:www.alientek.com * &sup1;ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢²&frac14; * V1.1 20230605 * ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç&sup1;ûÊ&sup1;ÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os Ê&sup1;Óà */ #endif /******************************************************************************************/ /* &frac14;ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* Ê&sup1;ÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñÊ&frac12;£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* Ê&sup1;ÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* ²»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ&frac14;æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ&sup1;ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR&frac14;Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç&sup1;ûÊ&sup1;ÄÜÁË&frac12;ÓÊÕ */ /* &frac12;ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* &frac12;ÓÊÕ״̬ * bit15£¬ &frac12;ÓÊÕÍê³É±êÖ¾ * bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d * bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âÊ&sup1;ÓõĴ®¿Ú&frac12;ÓÊÕ»º³å */ UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */ /** * @brief ´®¿ÚX³õÊ&frac14;»¯º¯Êý * @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô&frac14;ºÐèÒªÉèÖò¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾ­ÉèÖÃ&sup1;ýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñÊ&frac12; */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öÍ£Ö&sup1;λ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ&frac14;УÑéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²&frac14;þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áÊ&sup1;ÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º³åÒÔ&frac14;°&frac12;ÓÊÕ»º³å&frac12;ÓÊÕ×î´óÊý¾ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×²ã³õÊ&frac14;»¯º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê³ÉʱÖÓÊ&sup1;ÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP³õÊ&frac14;»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓÊ&sup1;ÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý&frac12;Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õÊ&frac14;»¯·¢ËÍÒý&frac12;Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý&frac12;Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õÊ&frac14;»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* Ê&sup1;ÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3£¬×ÓÓÅÏÈ&frac14;¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART¾ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* &frac12;ÓÊÕδÍê³É */ { if(g_usart_rx_sta & 0x4000) /* &frac12;ÓÊÕµ&frac12;ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê³ÉÁË */ } } else /* »&sup1;ûÊÕµ&frac12;0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ&frac14;&frac12;ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí&sup1;«Óú¯Êý */ #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntExit(); #endif } #endif (我要使输入的在LCD上面显示应该怎么做)
05-21
#include "dcmi_ov2640.h" #include "dcmi_ov2640_cfg.h" DCMI_HandleTypeDef hdcmi; // DCMI¾ä±ú DMA_HandleTypeDef DMA_Handle_dcmi; // DMA¾ä±ú volatile uint8_t DCMI_FrameState = 0; // DCMI״̬±êÖ¾£¬µ±Êý¾ÝÖ¡´«ÊäÍê³Éʱ£¬»á±» HAL_DCMI_FrameEventCallback() Öжϻص÷º¯ÊýÖà 1 volatile uint8_t OV2640_FPS ; // Ö¡ÂÊ /************************************************************************************************* * º¯ Êý Ãû: HAL_DCMI_MspInit * Èë¿Ú²ÎÊý: hdcmi - DCMI_HandleTypeDef¶¨ÒåµÄ±äÁ¿£¬&frac14;´±íʾ¶¨ÒåµÄ DCMI ¾ä±ú * ·µ »Ø Öµ: ÎÞ * º¯Êý&sup1;¦ÄÜ: ³õÊ&frac14;»¯ DCMI Òý&frac12;Å * ˵ Ã÷: ÎÞ *************************************************************************************************/ void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hdcmi->Instance==DCMI) { __HAL_RCC_DCMI_CLK_ENABLE(); // Ê&sup1;ÄÜ DCMI ÍâÉèʱÖÓ __HAL_RCC_GPIOE_CLK_ENABLE(); // Ê&sup1;ÄÜÏàÓ¦µÄGPIOʱÖÓ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); GPIO_OV2640_PWDN_CLK_ENABLE; // Ê&sup1;ÄÜPWDN Òý&frac12;ÅµÄ GPIO ʱÖÓ /**************************************************************************** Êý¾ÝÒý&frac12;ŠʱÖÓºÍͬ²&frac12;Òý&frac12;Å PH9 ------> DCMI_D0 PG9 ------> DCMI_VSYNC PH10 ------> DCMI_D1 PH8 ------> DCMI_HSYNC PH11 ------> DCMI_D2 PA6 ------> DCMI_PIXCLK PH12 ------> DCMI_D3 PH14 ------> DCMI_D4 SCCB ¿ØÖÆÒý&frac12;Å£¬³õÊ&frac14;»¯ÔÚ camera_sccb.c ÎÄ&frac14;þ PD3 ------> DCMI_D5 PH7 ------> SCCB_SCL PE5 ------> DCMI_D6 PH13 ------> SCCB_SDA PE6 ------> DCMI_D7 µôµç¿ØÖÆÒý&frac12;Å PH15 ------> PWDN ******************************************************************************/ GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); // ³õÊ&frac14;»¯ PWDN Òý&frac12;Å OV2640_PWDN_ON; // ¸ßµçÆ&frac12;£¬&frac12;øÈëµôµçÄ£Ê&frac12;£¬ÉãÏñÍ·Í£Ö&sup1;&sup1;¤×÷£¬´Ëʱ&sup1;¦ºÄ&frac12;µµ&frac12;×îµÍ GPIO_InitStruct.Pin = OV2640_PWDN_PIN; // PWDN Òý&frac12;Å GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // ÍÆÍìÊä³öÄ£Ê&frac12; GPIO_InitStruct.Pull = GPIO_PULLUP; // ÉÏÀ­ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // ËٶȵÈ&frac14;¶µÍ HAL_GPIO_Init(OV2640_PWDN_PORT, &GPIO_InitStruct); // ³õÊ&frac14;»¯ } } /*************************************************************************************************************************************** * º¯ Êý Ãû: MX_DCMI_Init * * º¯Êý&sup1;¦ÄÜ: ÅäÖÃDCMIÏà&sup1;زÎÊý * * ˵ Ã÷: 8λÊý¾ÝÄ£Ê&frac12;£¬È«Êý¾Ý¡¢È«Ö¡²¶×&frac12;£¬¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void MX_DCMI_Init(void) { hdcmi.Instance = DCMI; hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; // Ó²&frac14;þͬ²&frac12;Ä£Ê&frac12;£¬&frac14;´Ê&sup1;ÓÃÍⲿµÄVS¡¢HSÐźÅ&frac12;øÐÐͬ²&frac12; hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; // ÏñËØÊ±ÖÓÉÏÉýÑØÓÐЧ hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW; // VSµÍµçÆ&frac12;ÓÐЧ hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW; // HSµÍµçÆ&frac12;ÓÐЧ hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME; // ²¶»ñµÈ&frac14;¶£¬ÉèÖÃÿһ֡¶&frac14;&frac12;øÐв¶»ñ hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; // 8λÊý¾ÝÄ£Ê&frac12; hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE; // ²»Ê&sup1;ÓÃDCMIµÄJPEGÄ£Ê&frac12; hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL; // DCMI&frac12;Ó¿Ú²¶×&frac12;ËùÓÐÊý¾Ý hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD; // Ñ¡Ôñ¿ªÊ&frac14;×Ö&frac12;Ú£¬´Ó Ö¡/ÐÐ µÄµÚÒ»¸öÊý¾Ý¿ªÊ&frac14;²¶»ñ hdcmi.Init.LineSelectMode = DCMI_LSM_ALL; // ²¶»ñËùÓÐÐÐ hdcmi.Init.LineSelectStart = DCMI_OELS_ODD; // Ñ¡Ôñ¿ªÊ&frac14;ÐÐ,ÔÚÖ¡¿ªÊ&frac14;ºó²¶»ñµÚÒ»ÐÐ HAL_DCMI_Init(&hdcmi) ; HAL_NVIC_SetPriority(DCMI_IRQn, 0 ,5); // ÉèÖÃÖжÏÓÅÏÈ&frac14;¶ HAL_NVIC_EnableIRQ(DCMI_IRQn); // ¿ªÆôDCMIÖÐ¶Ï //// ÔÚJPGÄ£Ê&frac12;Ï£¬Ò»¶¨Òªµ¥¶ÀÊ&sup1;ÄܸÃÖÐ¶Ï // __HAL_DCMI_ENABLE_IT(&hdcmi, DCMI_IT_FRAME); // Ê&sup1;ÄÜ FRAME ÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Init * * º¯Êý&sup1;¦ÄÜ: ÅäÖà DMA Ïà&sup1;زÎÊý * * ˵ Ã÷: Ê&sup1;ÓõÄÊÇDMA2£¬ÍâÉèµ&frac12;´æ´¢Æ÷Ä£Ê&frac12;¡¢Êý¾Ýλ¿í32bit¡¢²¢¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void OV2640_DMA_Init(void) { __HAL_RCC_DMA2_CLK_ENABLE(); // Ê&sup1;ÄÜDMA2ʱÖÓ DMA_Handle_dcmi.Instance = DMA2_Stream7; // DMA2Êý¾ÝÁ÷7 DMA_Handle_dcmi.Init.Request = DMA_REQUEST_DCMI; // DMAÇëÇóÀ´×ÔDCMI DMA_Handle_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY; // ÍâÉèµ&frac12;´æ´¢Æ÷Ä£Ê&frac12; DMA_Handle_dcmi.Init.PeriphInc = DMA_PINC_DISABLE; // ÍâÉèµØÖ·&frac12;ûÖ&sup1;×ÔÔö DMA_Handle_dcmi.Init.MemInc = DMA_MINC_ENABLE; // ´æ´¢Æ÷µØÖ·×ÔÔö DMA_Handle_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; // DCMIÊý¾Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; // ´æ´¢Æ÷Êý¾Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; // Ñ­»·Ä£Ê&frac12; DMA_Handle_dcmi.Init.Priority = DMA_PRIORITY_LOW; // ÓÅÏÈ&frac14;¶µÍ DMA_Handle_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE; // Ê&sup1;ÄÜfifo DMA_Handle_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; // È«fifoÄ£Ê&frac12;£¬4*32bit´óС DMA_Handle_dcmi.Init.MemBurst = DMA_MBURST_SINGLE; // µ¥´Î´«Êä DMA_Handle_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE; // µ¥´Î´«Êä HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA __HAL_LINKDMA(&hdcmi, DMA_Handle, DMA_Handle_dcmi); // &sup1;ØÁªDCMI¾ä±ú HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0); // ÉèÖÃÖжÏÓÅÏÈ&frac14;¶ HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); // Ê&sup1;ÄÜÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Delay * Èë¿Ú²ÎÊý: Delay - ÑÓʱʱ&frac14;䣬µ¥Î» ms * º¯Êý&sup1;¦ÄÜ: &frac14;òµ¥ÑÓʱº¯Êý£¬²»ÊǺܾ«È· * ˵ Ã÷: ΪÁËÒÆÖ²µÄ&frac14;ò±ãÐÔ,´Ë´¦²ÉÓÃÈí&frac14;þÑÓʱ£¬Êµ&frac14;ÊÏîÄ¿ÖпÉÒÔÌæ»»³ÉRTOSµÄÑÓʱ»òÕßHAL¿âµÄÑÓʱ *****************************************************************************************************************************************/ void OV2640_Delay(volatile uint32_t Delay) { volatile uint16_t i; while (Delay --) { for (i = 0; i < 20000; i++); } // HAL_Delay(Delay); // ¿ÉÊ&sup1;ÓÃHAL¿âµÄÑÓʱ } /*************************************************************************************************************************************** * º¯ Êý Ãû: DCMI_OV2640_Init * * º¯Êý&sup1;¦ÄÜ: ³õÊ&frac14;SCCB¡¢DCMI¡¢DMAÒÔ&frac14;°ÅäÖÃOV2640 * *****************************************************************************************************************************************/ int8_t DCMI_OV2640_Init(void) { uint16_t Device_ID; // ¶¨Òå±äÁ¿´æ´¢Æ÷&frac14;þID SCCB_GPIO_Config(); // SCCBÒý&frac12;ųõÊ&frac14;»¯ MX_DCMI_Init(); // ³õÊ&frac14;»¯DCMIÅäÖÃÒý&frac12;Å OV2640_DMA_Init(); // ³õÊ&frac14;»¯DMAÅäÖà OV2640_Reset(); // Ö´ÐÐÈí&frac14;þ¸´Î» Device_ID = OV2640_ReadID(); // ¶ÁÈ¡Æ÷&frac14;þID if( (Device_ID == 0x2640) || (Device_ID == 0x2642) ) // &frac12;øÐÐÆ¥Å䣬ʵ&frac14;ÊµÄÆ÷&frac14;þID¿ÉÄÜÊÇ 0x2640 »òÕß 0x2642 { printf ("OV2640 OK,ID:0x%X\r\n",Device_ID); // Æ¥Åäͨ&sup1;ý OV2640_Config( OV2640_SVGA_Config ); // ÅäÖà SVGAÄ£Ê&frac12; ------> 800*600£¬ ×î´óÖ¡ÂÊ30Ö¡ // OV2640_Config( OV2640_UXGA_Config ); // ÅäÖà UXGAÄ£Ê&frac12; ------> 1600*1200£¬×î´óÖ¡ÂÊ15Ö¡ OV2640_Set_Framesize(OV2640_Width,OV2640_Height); // ÉèÖÃOV2640Êä³öµÄÍ&frac14;Ïñ´óС OV2640_DCMI_Crop(Display_Width, Display_Height, OV2640_Width, OV2640_Height ); // &frac12;«OV2640Êä³öÍ&frac14;Ïñ²Ã&frac14;ô³ÉÊÊÓ¦ÆÁÄ»µÄ´óС return OV2640_Success; // ·µ»Ø³É&sup1;¦±êÖ¾ } else { printf ("OV2640 ERROR!!!!! ID:%X\r\n",Device_ID); // ¶ÁÈ¡ID´íÎó return OV2640_Error; // ·µ»Ø´íÎó±êÖ¾ } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Continuous * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA&frac12;«Òª´«ÊäµÄµØÖ·£¬&frac14;´ÓÃÓÚ´æ´¢ÉãÏñÍ·Êý¾ÝµÄ´æ´¢ÇøµØÖ· * DMA_BufferSize - ´«ÊäµÄÊý¾Ý´óС£¬32λ¿í * * º¯Êý&sup1;¦ÄÜ: Æô¶¯DMA´«Ê䣬Á¬ÐøÄ£Ê&frac12; * * ˵ Ã÷: 1. ¿ªÆôÁ¬ÐøÄ£Ê&frac12;Ö®ºó£¬»áÒ»Ö±&frac12;øÐд«Ê䣬³ý·Ç&sup1;ÒÆð»òÕßÍ£Ö&sup1;DCMI * 2. OV2640Ê&sup1;ÓÃRGB565Ä£Ê&frac12;ʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö&frac12;ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý¾ÝΪ32λ¿í£¬&frac14;ÆËã DMA_BufferSize ʱ£¬ÐèÒª³ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ¡ 240*240·Ö±æÂÊ µÄÍ&frac14;Ïñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö&frac12;ÚµÄÊý¾Ý£¬ * Ôò DMA_BufferSize = 115200 / 4 = 28800 ¡£ *LXB *****************************************************************************************************************************************/ void OV2640_DMA_Transmit_Continuous(uint32_t DMA_Buffer,uint32_t DMA_BufferSize) { DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; // Ñ­»·Ä£Ê&frac12; HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA // Ê&sup1;ÄÜDCMI²É&frac14;¯Êý¾Ý,Á¬Ðø²É&frac14;¯Ä£Ê&frac12; HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Snapshot * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA&frac12;«Òª´«ÊäµÄµØÖ·£¬&frac14;´ÓÃÓÚ´æ´¢ÉãÏñÍ·Êý¾ÝµÄ´æ´¢ÇøµØÖ· * DMA_BufferSize - ´«ÊäµÄÊý¾Ý´óС£¬32λ¿í * * º¯Êý&sup1;¦ÄÜ: Æô¶¯DMA´«Ê䣬¿ìÕÕÄ£Ê&frac12;£¬´«ÊäÒ»Ö¡Í&frac14;ÏñºóÍ£Ö&sup1; * * ˵ Ã÷: 1. ¿ìÕÕÄ£Ê&frac12;£¬Ö»´«ÊäÒ»Ö¡µÄÊý¾Ý * 2. OV2640Ê&sup1;ÓÃRGB565Ä£Ê&frac12;ʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö&frac12;ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý¾ÝΪ32λ¿í£¬&frac14;ÆËã DMA_BufferSize ʱ£¬ÐèÒª³ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ¡ 240*240·Ö±æÂÊ µÄÍ&frac14;Ïñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö&frac12;ÚµÄÊý¾Ý£¬ * Ôò DMA_BufferSize = 115200 / 4 = 28800 ¡£ * 4. Ê&sup1;ÓøÃÄ£Ê&frac12;´«ÊäÍê³ÉÖ®ºó£¬DCMI»á±»&sup1;ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ÐèÒªµ÷Óà OV2640_DCMI_Resume() »Ö¸´DCMI * *****************************************************************************************************************************************/ void OV2640_DMA_Transmit_Snapshot(uint32_t DMA_Buffer,uint32_t DMA_BufferSize) { DMA_Handle_dcmi.Init.Mode = DMA_NORMAL; // Õý³£Ä£Ê&frac12; HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Suspend * * º¯Êý&sup1;¦ÄÜ: &sup1;ÒÆðDCMI£¬Í£Ö&sup1;²¶»ñÊý¾Ý * * ˵ Ã÷: 1. ¿ªÆôÁ¬ÐøÄ£Ê&frac12;Ö®ºó£¬ÔÙµ÷Óøú¯Êý£¬»áÍ£Ö&sup1;²¶»ñDCMIµÄÊý¾Ý * 2. ¿ÉÒÔµ÷Óà OV2640_DCMI_Resume() »Ö¸´DCMI * 3. ÐèҪעÒâµÄ£¬&sup1;ÒÆðDCMIÆÚ&frac14;䣬DMAÊÇûÓÐÍ£Ö&sup1;&sup1;¤×÷µÄ *LXB *****************************************************************************************************************************************/ void OV2640_DCMI_Suspend(void) { HAL_DCMI_Suspend(&hdcmi); // &sup1;ÒÆðDCMI } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Resume * * º¯Êý&sup1;¦ÄÜ: »Ö¸´DCMI£¬¿ªÊ&frac14;²¶»ñÊý¾Ý * * ˵ Ã÷: 1. µ±DCMI±»&sup1;ÒÆðʱ£¬¿ÉÒÔµ÷Óøú¯Êý»Ö¸´ * 2. Ê&sup1;Óà OV2640_DMA_Transmit_Snapshot() ¿ìÕÕÄ£Ê&frac12;£¬´«ÊäÍê³ÉÖ®ºó£¬DCMIÒ²»á±»&sup1;ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ * ÐèÒªµ÷Óñ¾º¯Êý»Ö¸´DCMI²¶»ñ * *****************************************************************************************************************************************/ void OV2640_DCMI_Resume(void) { (&hdcmi)->State = HAL_DCMI_STATE_BUSY; // ±ä¸üDCMI±êÖ¾ (&hdcmi)->Instance->CR |= DCMI_CR_CAPTURE; // ¿ªÆôDCMI²¶»ñ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Stop * * º¯Êý&sup1;¦ÄÜ: &frac12;ûÖ&sup1;DCMIµÄDMAÇëÇó£¬Í£Ö&sup1;DCMI²¶»ñ£¬&frac12;ûÖ&sup1;DCMIÍâÉè * *****************************************************************************************************************************************/ void OV2640_DCMI_Stop(void) { HAL_DCMI_Stop(&hdcmi); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Crop * * Èë¿Ú²ÎÊý: Displey_XSize ¡¢Displey_YSize - ÏÔʾÆ÷µÄ³¤¿í * Sensor_XSize¡¢Sensor_YSize - ÉãÏñÍ·´«¸ÐÆ÷Êä³öÍ&frac14;ÏñµÄ³¤¿í * * º¯Êý&sup1;¦ÄÜ: Ê&sup1;ÓÃDCMIµÄ²Ã&frac14;ô&sup1;¦ÄÜ£¬&frac12;«´«¸ÐÆ÷Êä³öµÄÍ&frac14;Ïñ²Ã&frac14;ô³ÉÊÊÓ¦ÆÁÄ»µÄ´óС * * ˵ Ã÷: 1. ÒòΪÉãÏñÍ·Êä³öµÄ»­Ãæ±ÈÀý&sup1;̶¨Îª4:3£¬²»Ò»¶¨Æ¥ÅäÏÔʾÆ÷ * 2. ÐèҪעÒâµÄÊÇ£¬ÉãÏñÍ·Êä³öµÄÍ&frac14;Ïñ³¤¡¢¿í±ØÐëÒªÄܱ»4Õû³ý£¡£¨ Ê&sup1;ÓÃOV2640_Set_Framesizeº¯Êý&frac12;øÐÐÉèÖà £© * 3. DCMIµÄË®Æ&frac12;ÓÐЧÏñËØÒ²±ØÐëÒªÄܱ»4Õû³ý£¡ * 4. º¯Êý»á&frac14;ÆËãË®Æ&frac12;ºÍ´&sup1;Ö±Æ«ÒÆ£¬¾¡Á¿Èû­Ãæ¾ÓÖвÃ&frac14;ô *****************************************************************************************************************************************/ int8_t OV2640_DCMI_Crop(uint16_t Displey_XSize,uint16_t Displey_YSize,uint16_t Sensor_XSize,uint16_t Sensor_YSize ) { uint16_t DCMI_X_Offset,DCMI_Y_Offset; // Ë®Æ&frac12;ºÍ´&sup1;Ö±Æ«ÒÆ£¬´&sup1;Ö±´ú±íµÄÊÇÐÐÊý£¬Ë®Æ&frac12;´ú±íµÄÊÇÏñËØÊ±ÖÓÊý£¨PCLKÖÜÆÚÊý£© uint16_t DCMI_CAPCNT; // Ë®Æ&frac12;ÓÐЧÏñËØ£¬´ú±íµÄÊÇÏñËØÊ±ÖÓÊý£¨PCLKÖÜÆÚÊý£© uint16_t DCMI_VLINE; // ´&sup1;Ö±ÓÐЧÐÐÊý if( (Displey_XSize>=Sensor_XSize)|| (Displey_YSize>=Sensor_YSize) ) { // printf("ʵ&frac14;ÊÏÔʾµÄ³ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ·Êä³öµÄ³ß´ç£¬Í˳öDCMI²Ã&frac14;ô\r\n"); return OV2640_Error; //Èç&sup1;ûʵ&frac14;ÊÏÔʾµÄ³ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ·Êä³öµÄ³ß´ç£¬ÔòÍ˳öµ±Ç°º¯Êý£¬²»&frac12;øÐвÃ&frac14;ô } // ÔÚÉèÖÃΪRGB565¸ñÊ&frac12;ʱ£¬Ë®Æ&frac12;Æ«ÒÆ£¬±ØÐëÊÇÆæÊý£¬·ñÔò»­ÃæÉ«²Ê²»ÕýÈ·£¬ // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö&frac12;Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔ±ØÐë´ÓÆæÊýλ¿ªÊ&frac14;£¬²»È»Êý¾Ý»á´íÂÒ£¬ // ÐèҪעÒâµÄÊÇ£¬&frac14;Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ&frac14;ËãÆðµÄ £¡ DCMI_X_Offset = Sensor_XSize - Displey_XSize; // ʵ&frac14;Ê&frac14;ÆËã&sup1;ý³ÌΪ£¨Sensor_XSize - LCD_XSize£©/2*2 // &frac14;ÆËã´&sup1;Ö±Æ«ÒÆ£¬¾¡Á¿Èû­Ãæ¾ÓÖвÃ&frac14;ô£¬¸ÃÖµ´ú±íµÄÊÇÐÐÊý£¬ DCMI_Y_Offset = (Sensor_YSize - Displey_YSize)/2-1; // &frac14;Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ&frac14;ËãÆðµÄ£¬ËùÒÔÒª-1 // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö&frac12;Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔÒª³Ë2 // ×îÖյõ&frac12;µÄ&frac14;Ä´æÆ÷Öµ£¬±ØÐëÒªÄܱ»4Õû³ý£¡ DCMI_CAPCNT = Displey_XSize*2-1; // &frac14;Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ&frac14;ËãÆðµÄ£¬ËùÒÔÒª-1 DCMI_VLINE = Displey_YSize-1; // ´&sup1;Ö±ÓÐЧÐÐÊý // printf("%d %d %d %d\r\n",DCMI_X_Offset,DCMI_Y_Offset,DCMI_CAPCNT,DCMI_VLINE); HAL_DCMI_ConfigCrop (&hdcmi,DCMI_X_Offset,DCMI_Y_Offset,DCMI_CAPCNT,DCMI_VLINE);// ÉèÖòÃ&frac14;ô´°¿Ú HAL_DCMI_EnableCrop(&hdcmi); // Ê&sup1;ÄܲÃ&frac14;ô return OV2640_Success; } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Reset * * º¯Êý&sup1;¦ÄÜ: Ö´ÐÐÈí&frac14;þ¸´Î» * * ˵ Ã÷: ÔÚÅäÖÃOV2640֮ǰ£¬ÐèÒªÖ´ÐÐÒ»´ÎÈí&frac14;þ¸´Î» * *****************************************************************************************************************************************/ void OV2640_Reset(void) { OV2640_Delay(5); // µÈ´ýÄ£¿éÉϵçÎȶ¨£¬×îÉÙ5ms£¬È»ºóÀ­µÍPWDN OV2640_PWDN_OFF; // PWDN Òý&frac12;ÅÊä³öµÍµçÆ&frac12;£¬²»¿ªÆôµôµçÄ£Ê&frac12;£¬ÉãÏñÍ·Õý³£&sup1;¤×÷£¬´ËʱÉãÏñÍ·Ä£¿éµÄ°×É«LED»áµãÁÁ // ¸ù¾ÝOV2640µÄÉϵçʱÐò£¬Ó²&frac14;þ¸´Î»µÄ³ÖÐøÊ±&frac14;äÒª>=3ms£¬Â&sup1;С°àµÄOV2640²ÉÓÃÓ²&frac14;þRC¸´Î»£¬³ÖÐøÊ±&frac14;ä´ó¸ÅÔÚ6ms×óÓÒ // Òò´Ë&frac14;ÓÈëÑÓʱ£¬µÈ´ýÓ²&frac14;þ¸´Î»Íê³É²¢Îȶ¨ÏÂÀ´ OV2640_Delay(5); SCCB_WriteReg( OV2640_SEL_Registers, OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR &frac14;Ä´æÆ÷×é SCCB_WriteReg( OV2640_SENSOR_COM7, 0x80); // Æô¶¯Èí&frac14;þ¸´Î» // ¸ù¾ÝOV2640µÄÈí&frac14;þ¸´Î»Ê±Ðò£¬Èí&frac14;þ¸´Î»Ö´Ðкó£¬Òª>=2ms·&frac12;¿ÉÖ´ÐÐSCCBÅäÖ㬴˴¦²ÉÓñ£ÊØÒ»µãµÄ²ÎÊý£¬ÑÓʱ10ms OV2640_Delay(10); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_ReadID * * º¯Êý&sup1;¦ÄÜ: ¶ÁÈ¡ OV2640 µÄÆ÷&frac14;þID * * ˵ Ã÷: ʵ&frac14;ÊµÄÆ÷&frac14;þID¿ÉÄÜÊÇ 0x2640 »òÕß 0x2642£¬Åú´Î²»Í¬ID¿ÉÄܻ᲻һÑù * *****************************************************************************************************************************************/ uint16_t OV2640_ReadID(void) { uint8_t PID_H,PID_L; // ID±äÁ¿ SCCB_WriteReg( OV2640_SEL_Registers, OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR &frac14;Ä´æÆ÷×é PID_H = SCCB_ReadReg(OV2640_SENSOR_PIDH); // ¶ÁÈ¡ID¸ß×Ö&frac12;Ú PID_L = SCCB_ReadReg(OV2640_SENSOR_PIDL); // ¶ÁÈ¡IDµÍ×Ö&frac12;Ú return(PID_H<<8)|PID_L; // ·µ»ØÍêÕûµÄÆ÷&frac14;þID } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Config * * Èë¿Ú²ÎÊý: (*ConfigData)[2] - ÒªÅäÖõIJÎÊý£¬¿ÉÅäÖÃΪ OV2640_SVGA_Config »ò OV2640_UXGA_Config * * º¯Êý&sup1;¦ÄÜ: ÅäÖà OV2640 ´«¸ÐÆ÷ºÍDSP²ÎÊý * * ˵ Ã÷: 1. ¿ÉÅäÖÃΪ SVGA »òÕß UXGAÄ£Ê&frac12; * 2. SVGA ·Ö±æÂÊΪ800*600£¬×î¸ßÖ§³Ö30Ö¡ * 3. UXGA ·Ö±æÂÊΪ1600*1200£¬×î¸ßÖ§³Ö15Ö¡ * 4. ²ÎÊý¶¨ÒåÔÚ dcmi_ov2640_cfg.h * *****************************************************************************************************************************************/ void OV2640_Config( const uint8_t (*ConfigData)[2] ) { uint32_t i; // &frac14;ÆÊý±äÁ¿ for( i=0; ConfigData[i][0]; i++) { SCCB_WriteReg( ConfigData[i][0], ConfigData[i][1]); // &frac12;øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: pixformat - ÏñËØ¸ñÊ&frac12;£¬¿ÉÑ¡Ôñ Pixformat_RGB565¡¢Pixformat_JPEG * * º¯Êý&sup1;¦ÄÜ: ÉèÖÃÊä³öµÄÏñËØ¸ñÊ&frac12; * *****************************************************************************************************************************************/ void OV2640_Set_Pixformat(uint8_t pixformat) { const uint8_t (*ConfigData)[2]; uint32_t i; // &frac14;ÆÊý±äÁ¿ switch (pixformat) { case Pixformat_RGB565: ConfigData = OV2640_RGB565_Config; break; case Pixformat_JPEG: ConfigData = OV2640_JPEG_Config; break; default: break; } for( i=0; ConfigData[i][0]; i++) { SCCB_WriteReg( ConfigData[i][0], ConfigData[i][1]); // &frac12;øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: width - ʵ&frac14;ÊÊä³öÍ&frac14;ÏñµÄ³¤¶È£¬height - ʵ&frac14;ÊÊä³öÍ&frac14;ÏñµÄ¿í¶È * * º¯Êý&sup1;¦ÄÜ: ÉèÖÃʵ&frac14;ÊÊä³öµÄÍ&frac14;Ïñ´óС * * ˵ Ã÷: 1. OV2640ÉèÖÃΪ SVGA£¨800*600£© »òÕß UXGA£¨1600*1200£©Ä£Ê&frac12;£¬Í&frac14;Ïñ´óСͨ³£Óëʵ&frac14;ÊÓÃµÄÆÁÄ»·Ö±æÂʲ»Ò»Ñù£¬ * Òò´Ë¿ÉÒÔµ÷Óôκ¯Êý£¬ÉèÖÃʵ&frac14;ÊÊä³öµÄÍ&frac14;Ïñ´óС * 2. ÐèҪעÒâµÄÊÇ£¬ÒªÉèÖõÄÍ&frac14;Ïñ³¤¡¢¿í±ØÐëÄܱ»4Õû³ý£¡ * 3. ²¢²»ÊÇÉèÖÃÊä³öµÄÍ&frac14;Ïñ·Ö±æÂÊÔ&frac12;С֡ÂʾÍÔ&frac12;¸ß£¬Ö¡ÂÊÖ»ºÍÅäÖõÄÄ£Ê&frac12;ÓÐ&sup1;Ø£¬ÀýÈçÅäÖÃΪSVGA×î¸ßÖ»ÄÜÖ§³Ö30Ö¡ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Framesize(uint16_t width,uint16_t height) { if( (width%4)||(height%4) ) // Êä³öÍ&frac14;ÏñµÄ´óСһ¶¨ÒªÄܱ»4Õû³ý { return OV2640_Error; // ·µ»Ø´íÎó±êÖ¾ } SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP&frac14;Ä´æÆ÷×é SCCB_WriteReg(0X5A, width/4 &0XFF); // ʵ&frac14;ÊÍ&frac14;ÏñÊä³öµÄ¿í¶È£¨OUTW£©£¬7~0 bit£¬&frac14;Ä´æÆ÷µÄÖµµÈÓÚʵ&frac14;ÊÖµ/4 SCCB_WriteReg(0X5B, height/4 &0XFF); // ʵ&frac14;ÊÍ&frac14;ÏñÊä³öµÄ¸ß¶È£¨OUTH£©£¬7~0 bit£¬&frac14;Ä´æÆ÷µÄÖµµÈÓÚʵ&frac14;ÊÖµ/4 SCCB_WriteReg(0X5C, (width/4>>8&0X03)|(height/4>>6&0x04) ); // ÉèÖÃZMHHµÄBit[2:0]£¬Ò²¾ÍÊÇOUTH µÄµÚ 8 bit£¬OUTW µÄµÚ 9~8 bit£¬ SCCB_WriteReg(OV2640_DSP_RESET,0X00); // ¸´Î» return OV2640_Success; // ³É&sup1;¦ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Horizontal_Mirror * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í&frac14;Ïñ»áË®Æ&frac12;¾µÏñ£¬ÖÃ0ʱ»Ö¸´Õý³£ * * º¯Êý&sup1;¦ÄÜ: ÓÃÓÚÉèÖÃÊä³öµÄÍ&frac14;ÏñÊÇ·ñ&frac12;øÐÐË®Æ&frac12;¾µÏñ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Horizontal_Mirror( int8_t ConfigState ) { uint8_t OV2640_Reg; // &frac14;Ä´æÆ÷µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR &frac14;Ä´æÆ÷×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ¡ 0x04 µÄ&frac14;Ä´æÆ÷Öµ // REG04,&frac14;Ä´æÆ÷×é4£¬&frac14;Ä´æÆ÷µØÖ·Îª 0x04£¬¸Ã&frac14;Ä´æÆ÷µÄBit[7]£¬ÓÃÓÚÉèÖÃË®Æ&frac12;ÊÇ·ñ¾µÏñ if ( ConfigState == OV2640_Enable ) // Èç&sup1;ûÊ&sup1;ÄܾµÏñ { OV2640_Reg |= 0X80; // Bit[7]ÖÃ1Ôò¾µÏñ } else // È¡Ïû¾µÏñ { OV2640_Reg &= ~0X80; // Bit[7]ÖÃ0ÔòÊÇÕý³£Ä£Ê&frac12; } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë&frac14;Ä´æÆ÷ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Vertical_Flip * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í&frac14;Ïñ»á´&sup1;Ö±·­×ª£¬ÖÃ0ʱ»Ö¸´Õý³£ * * º¯Êý&sup1;¦ÄÜ: ÓÃÓÚÉèÖÃÊä³öµÄÍ&frac14;ÏñÊÇ·ñ&frac12;øÐд&sup1;Ö±·­×ª * *****************************************************************************************************************************************/ int8_t OV2640_Set_Vertical_Flip( int8_t ConfigState ) { uint8_t OV2640_Reg; // &frac14;Ä´æÆ÷µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR &frac14;Ä´æÆ÷×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ¡ 0x04 µÄ&frac14;Ä´æÆ÷Öµ // REG04,&frac14;Ä´æÆ÷×é4£¬&frac14;Ä´æÆ÷µØÖ·Îª 0x04£¬¸Ã&frac14;Ä´æÆ÷µÄµÚBit[6]£¬ÓÃÓÚÉèÖÃË®Æ&frac12;ÊÇ´&sup1;Ö±·­×ª if ( ConfigState == OV2640_Enable ) { // ´Ë´¦ÉèÖòο&frac14;OpenMVµÄÇý¶¯ // Bit[4]¾ßÌåµÄ×÷ÓÃÊÇʲôÊÖ²áûÓÐ˵£¬Èç&sup1;û´&sup1;Ö±·­×ªÖ®ºó£¬¸Ãλ²»ÖÃ1µÄ»°£¬ÑÕÉ«»á²»¶Ô OV2640_Reg |= 0X40|0x10 ; // Bit[6]ÖÃ1ʱ£¬Í&frac14;Ïñ»á´&sup1;Ö±·­×ª } else // È¡Ïû·­×ª { OV2640_Reg &= ~(0X40|0x10 ); // &frac12;«Bit[6]ºÍBit[4]¶&frac14;д0 } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë&frac14;Ä´æÆ÷ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Saturation * * Èë¿Ú²ÎÊý: Saturation - ±¥ºÍ¶È£¬¿ÉÉèÖÃΪ5¸öµÈ&frac14;¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö&frac14;Ä´æÆ÷ÈçºÎÊ&sup1;Óã¬Òò´ËÕâÀïÖ±&frac12;ÓÊ&sup1;ÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2.±¥ºÍ¶ÈÔ&frac12;¸ß£¬É«²Ê¾ÍÔ&frac12;ÏÊÑÞ£¬µ«µ±ÏàÓ¦µÄÇåÎú¶È»áÏÂ&frac12;µ£¬Ôëµã±ä¶à * *****************************************************************************************************************************************/ void OV2640_Set_Saturation(int8_t Saturation) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP&frac14;Ä´æÆ÷×é switch (Saturation) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x68); SCCB_WriteReg(OV2640_DSP_BPDATA,0x68); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x48); SCCB_WriteReg(OV2640_DSP_BPDATA,0x48); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x38); SCCB_WriteReg(OV2640_DSP_BPDATA,0x38); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x28); SCCB_WriteReg(OV2640_DSP_BPDATA,0x28); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Brightness * * Èë¿Ú²ÎÊý: Brightness - ÁÁ¶È£¬¿ÉÉèÖÃΪ5¸öµÈ&frac14;¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö&frac14;Ä´æÆ÷ÈçºÎÊ&sup1;Óã¬Òò´ËÕâÀïÖ±&frac12;ÓÊ&sup1;ÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2. ÁÁ¶ÈÔ&frac12;¸ß£¬»­Ãæ¾ÍÔ&frac12;Ã÷ÁÁ£¬µ«ÊÇ»á±äÄ£ºýһЩ * *****************************************************************************************************************************************/ void OV2640_Set_Brightness(int8_t Brightness) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP&frac14;Ä´æÆ÷×é switch (Brightness) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x40); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x30); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x10); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Contrast * * Èë¿Ú²ÎÊý: Contrast - ¶Ô±È¶È£¬¿ÉÉèÖÃΪ5¸öµÈ&frac14;¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö&frac14;Ä´æÆ÷ÈçºÎÊ&sup1;Óã¬Òò´ËÕâÀïÖ±&frac12;ÓÊ&sup1;ÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2. ¶Ô±È¶ÈÔ&frac12;¸ß£¬»­ÃæÔ&frac12;ÇåÎú£¬ºÚ°×Ô&frac12;&frac14;Ó·ÖÃ÷ * *****************************************************************************************************************************************/ void OV2640_Set_Contrast(int8_t Contrast) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP&frac14;Ä´æÆ÷×é switch (Contrast) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x28); SCCB_WriteReg(OV2640_DSP_BPDATA,0x0c); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x24); SCCB_WriteReg(OV2640_DSP_BPDATA,0x16); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x1c); SCCB_WriteReg(OV2640_DSP_BPDATA,0x2a); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x18); SCCB_WriteReg(OV2640_DSP_BPDATA,0x34); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Effect * * Èë¿Ú²ÎÊý: effect_Mode - ÌØÐ§Ä£Ê&frac12;£¬¿ÉÑ¡Ôñ²ÎÊý OV2640_Effect_Normal¡¢OV2640_Effect_Negative¡¢ * OV2640_Effect_BW¡¢OV2640_Effect_BW_Negative * * º¯Êý&sup1;¦ÄÜ: ÓÃÓÚÉèÖÃOV2640µÄÌØÐ§£¬Õý³£¡¢¸ºÆ¬¡¢ºÚ°×¡¢ºÚ°×+¸ºÆ¬µÈÄ£Ê&frac12; * * ˵ Ã÷: ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö&frac14;Ä´æÆ÷ÈçºÎÊ&sup1;Óã¬Òò´ËÕâÀïÖ±&frac12;ÓÊ&sup1;ÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * *****************************************************************************************************************************************/ void OV2640_Set_Effect(uint8_t effect_Mode) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP&frac14;Ä´æÆ÷×é switch (effect_Mode) { case OV2640_Effect_Normal: // Õý³£Ä£Ê&frac12; SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_Negative: // ¸ºÆ¬Ä£Ê&frac12;£¬Ò²¾ÍÊÇÑÕɫȫ²¿È¡·´ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x40); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_BW: // ºÚ°×Ä£Ê&frac12; SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x18); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_BW_Negative: // ºÚ°×+¸ºÆ¬Ä£Ê&frac12; SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: HAL_DCMI_FrameEventCallback * * º¯Êý&sup1;¦ÄÜ: Ö¡»Øµ÷º¯Êý£¬Ã¿´«ÊäÒ»Ö¡Êý¾Ý£¬»á&frac12;øÈë¸ÃÖжϷþÎñº¯Êý * * ˵ Ã÷: ÿ´Î´«ÊäÍêÒ»Ö¡£¬¶ÔÏàÓ¦µÄ±ê־λ&frac12;øÐвÙ×÷£¬²¢&frac14;ÆËãÖ¡ÂÊ *****************************************************************************************************************************************/ void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) { static uint32_t DCMI_Tick = 0; // ÓÃÓÚ±£´æµ±Ç°µÄʱ&frac14;ä&frac14;ÆÊýÖµ static uint8_t DCMI_Frame_Count = 0; // Ö¡Êý&frac14;ÆÊý if(HAL_GetTick() - DCMI_Tick >= 1000) // ÿ¸ô 1s &frac14;ÆËãÒ»´ÎÖ¡ÂÊ { DCMI_Tick = HAL_GetTick(); // ÖØÐ»ñÈ¡µ±Ç°Ê±&frac14;ä&frac14;ÆÊýÖµ OV2640_FPS = DCMI_Frame_Count; // »ñµÃfps DCMI_Frame_Count = 0; // &frac14;ÆÊýÇå0 } DCMI_Frame_Count ++; // û&frac12;øÈëÒ»´ÎÖжϣ¨Ã¿´Î´«ÊäÍêÒ»Ö¡Êý¾Ý£©£¬&frac14;ÆÊýÖµ+1 DCMI_FrameState = 1; // ´«ÊäÍê³É±ê־λÖÃ1 } /*************************************************************************************************************************************** * º¯ Êý Ãû: HAL_DCMI_ErrorCallback * * º¯Êý&sup1;¦ÄÜ: ´íÎ󻨵÷º¯Êý * * ˵ Ã÷: µ±·¢ÉúDMA´«Êä´íÎó»òÕßFIFOÒç³ö´íÎó¾Í»á&frac12;øÈë *****************************************************************************************************************************************/ void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi) { // if( HAL_DCMI_GetError(hdcmi) == HAL_DCMI_ERROR_OVR) // { // printf("FIFOÒç³ö´íÎ󣡣¡£¡\r\n"); // } printf("error:0x%x£¡£¡£¡\r\n",HAL_DCMI_GetError(hdcmi)); } /*********************************************************************************************************************************************************************************************************************************************LXB*************/ // Â&sup1;С°à 代码分析
05-12
``` #include "adc.h" #include "delay.h" #include "math.h" //³õÊ&frac14;»¯ADC //ÕâÀïÎÒÃÇ&frac12;öÒÔ&sup1;æÔòͨµÀΪÀý //ÎÒÃÇĬÈÏ&frac12;«¿ªÆôͨµÀ0~3 void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //Ê&sup1;ÄÜADC1ͨµÀʱÖÓ //ÆôÓÃGPIOAºÍADC1µÄʱÖÓ //GPIOAÖ¸ADCÊäÈëÒý&frac12;ÅËùÔÚµÄGPIO×é¡£ ADC1Ö¸Ê&sup1;ÓõÄADCÄ£¿é RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ÉèÖÃADC·ÖƵÒò×Ó6, 72MHz/6=12MHz, ADC×î´óʱ&frac14;ä²»Äܳ¬&sup114MHz //PA1 ×÷ΪģÄâͨµÀÊäÈëÒý&frac12;Å GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //Ä£ÄâÊäÈëÒý&frac12;Å GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); //¸´Î»ADC1,&frac12;«ÍâÉè ADC1 µÄÈ«²¿&frac14;Ä´æÆ÷ÖØÉèΪȱʡֵ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC&sup1;¤×÷Ä£Ê&frac12;:ADC1ºÍADC2&sup1;¤×÷ÔÚ¶ÀÁ¢Ä£Ê&frac12; ADC_InitStructure.ADC_ScanConvMode = DISABLE; //Ä£Êýת»»&sup1;¤×÷ÔÚµ¥Í¨µÀÄ£Ê&frac12; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //Ä£Êýת»»&sup1;¤×÷ÔÚµ¥´Îת»»Ä£Ê&frac12; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ת»»ÓÉÈí&frac14;þ¶ø²»ÊÇÍⲿ´¥·¢Æô¶¯ ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADCÊý¾ÝÓÒ¶ÔÆë ADC_InitStructure.ADC_NbrOfChannel = 1; //˳Ðò&frac12;øÐÐ&sup1;æÔòת»»µÄADCͨµÀµÄÊýÄ¿ ADC_Init(ADC1, &ADC_InitStructure); //¸ù¾ÝADC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õÊ&frac14;»¯ÍâÉèADCxµÄ&frac14;Ä´æÆ÷ ADC_Cmd(ADC1, ENABLE); //Ê&sup1;ÄÜÖ¸¶¨µÄADC1 ADC_ResetCalibration(ADC1); //Ê&sup1;Äܸ´Î»Ð£×&frac14; while(ADC_GetResetCalibrationStatus(ADC1)); //µÈ´ý¸´Î»Ð£×&frac14;&frac12;áÊø ADC_StartCalibration(ADC1); //¿ªÆôADУ×&frac14; while(ADC_GetCalibrationStatus(ADC1)); //µÈ´ýУ×&frac14;&frac12;áÊø // ADC_SoftwareStartConvCmd(ADC1, ENABLE); //Ê&sup1;ÄÜÖ¸¶¨µÄADC1µÄÈí&frac14;þת»»Æô¶¯&sup1;¦ÄÜ } //»ñµÃADCÖµ //ch:ͨµÀÖµ 0~3 u16 Get_Adc(u8 ch) { //ÉèÖÃÖ¸¶¨ADCµÄ&sup1;æÔò×éͨµÀ£¬Ò»¸öÐòÁУ¬²ÉÑùʱ&frac14;ä ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADCͨµÀ,²ÉÑùʱ&frac14;äΪ239.5ÖÜÆÚ ADC_SoftwareStartConvCmd(ADC1, ENABLE); //Ê&sup1;ÄÜÖ¸¶¨µÄADC1µÄÈí&frac14;þת»»Æô¶¯&sup1;¦ÄÜ while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»&frac12;áÊø return ADC_GetConversionValue(ADC1); //·µ»Ø×î&frac12;üÒ»´ÎADC1&sup1;æÔò×éµÄת»»&frac12;á&sup1;û } u16 Get_Adc_Average(u8 ch,u8 times) { u32 temp_val=0; u8 t; for(t=0;t<times;t++) { temp_val+=Get_Adc(ch); //µ¥´Î²ÉÑù delay_ms(1); } return temp_val/times; } float mq135ppm(void) { float tempData = 0; float Vol ; float RS; float ppm; float R0; tempData += Get_Adc_Average(1, 5); delay_ms(5); Vol = (tempData*5/4096); RS = (5-Vol)/(Vol*10); R0=6.64; ppm = pow(11.5428*R0/RS, 0.6549f); return ppm; }```这段基于STM32F103C8T6的ADC代码中,怎么理解关于MQ135的代码float mq135ppm(void),这段代码的使用和AD转换有关吗?
03-19
////////////////////////////////////////////////////////////////////////////////// //±¾³ÌÐòÖ»&sup1;©Ñ§Ï°Ê&sup1;Óã¬Î´¾­×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ; //ÐÀÞ±µç×Ó // // ÎÄ &frac14;þ Ãû :yanwu.c // °æ ±¾ ºÅ : v1.0 // ×÷ Õß : ÐÀÞ±µç×Ó // Éú³ÉÈÕÆÚ : 20200101 // ×î&frac12;üÐÞ¸Ä : // &sup1;¦ÄÜÃèÊö :Ö÷º¯Êý // ÐÞ¸ÄÀúÊ· : // ÈÕ ÆÚ : // ×÷ Õß : ÐÀÞ±µç×Ó // ÐÞ¸ÄÄÚÈÝ : ´´&frac12;¨ÎÄ&frac14;þ //°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£ //Copyright(C) ÐÀÞ±µç×Ó2020/3/16 //All rights reserved //******************************************************************************/. //³ÌÐòÍ·º¯Êý #include <reg52.h> #include <intrins.h> //°üº¬Í·ÎÄ&frac14;þ //ÏÔʾº¯Êý #include <display.h> //ºê¶¨Òå #define uint unsigned int #define uchar unsigned char //&sup1;Ü&frac12;ÅÉùÃ÷ sbit LED_R= P2^2;//ºìµÆ sbit LED_G= P2^0;//ÂÌµÆ sbit FENG = P2^5;//·äÃùÆ÷ //sbit san=P3^4; //·çÉÈ¿ØÖÆ£¨Ñ¡Å䣩 sbit CS = P1^4; sbit Clk = P1^2; sbit DATI = P1^3; sbit DATO = P1^3; //ADC0832Òý&frac12;Å //°´&frac14;ü sbit Key1=P2^6; //ÉèÖÃ&frac14;ü sbit Key2=P2^7; //&frac14;Ó°´&frac14;ü sbit Key3=P3^7; //&frac14;õ°´&frac14;ü bit bdata flag; //±¨¾¯±ê־λ uchar set; //ÉèÖÃ״̬ /*******************************¶¨ÒåÈ«¾Ö±äÁ¿********************************/ unsigned char dat = 0; //ADÖµ unsigned char CH=0; //ͨµÀ±äÁ¿ unsigned int sum=0; //Æ&frac12;¾ùÖµ&frac14;ÆËãʱµÄ×ÜÊý unsigned char m=0; //º¯ÊýÉùÃ÷ extern uchar ADC0809(); extern void Key(); //¾Æ¾«º¬Á¿±äÁ¿ uchar temp=0; uchar WARNING=25; //±¨¾¯Öµ /**************************************************************************** º¯Êý&sup1;¦ÄÜ:ADת»»×Ó³ÌÐò Èë¿Ú²ÎÊý:CH ³ö¿Ú²ÎÊý:dat ****************************************************************************/ unsigned char adc0832(unsigned char CH) { unsigned char i,test,adval; adval = 0x00; test = 0x00; Clk = 0; //³õÊ&frac14;»¯ DATI = 1; _nop_(); CS = 0; _nop_(); Clk = 1; _nop_(); if ( CH == 0x00 ) //ͨµÀÑ¡Ôñ { Clk = 0; DATI = 1; //ͨµÀ0µÄµÚһλ _nop_(); Clk = 1; _nop_(); Clk = 0; DATI = 0; //ͨµÀ0µÄµÚ¶þλ _nop_(); Clk = 1; _nop_(); } else { Clk = 0; DATI = 1; //ͨµÀ1µÄµÚһλ _nop_(); Clk = 1; _nop_(); Clk = 0; DATI = 1; //ͨµÀ1µÄµÚ¶þλ _nop_(); Clk = 1; _nop_(); } Clk = 0; DATI = 1; for( i = 0;i < 8;i++ ) //¶Áȡǰ8λµÄÖµ { _nop_(); adval <<= 1; Clk = 1; _nop_(); Clk = 0; if (DATO) adval |= 0x01; else adval |= 0x00; } for (i = 0; i < 8; i++) //¶ÁÈ¡ºó8λµÄÖµ { test >>= 1; if (DATO) test |= 0x80; else test |= 0x00; _nop_(); Clk = 1; _nop_(); Clk = 0; } if (adval == test) //±È&frac12;Ïǰ8λÓëºó8λµÄÖµ£¬Èç&sup1;û²»ÏàͬÉáÈ¥¡£ÈôÒ»Ö±³öÏÖÏÔʾΪÁ㣬Çë&frac12;«¸ÃÐÐÈ¥µô dat = test; nop_(); CS = 1; //ÊÍ·ÅADC0832 DATO = 1; Clk = 1; return dat; } void init() //³õÊ&frac14;»¯º¯Êý { TMOD=0x01; //&sup1;¤×÷·&frac12;Ê&frac12; TL0=0xb0; TH0=0x3c; //¸³³õÖµ£¨12MHz¾§ÕñµÄ50ms£© EA=1; //´ò¿ªÖжÏ×Ü¿ª&sup1;Ø ET0=1; //´ò¿ªÖжÏÔÊÐí¿ª&sup1;Ø TR0=1; //´ò¿ª¶¨Ê±Æ÷¿ª&sup1;Ø } void main() //Ö÷º¯Êý { Init1602();//³õÊ&frac14;»¯ÏÔʾ init(); //³õÊ&frac14;»¯¶¨Ê±Æ÷ while(1) //&frac12;øÈëÑ­»· { for(m=0;m<50;m++) //¶Á50´ÎADÖµ sum = adc0832(0)+sum; //¶Áµ&frac12;µÄADÖµ£¬&frac12;«¶Áµ&frac12;µÄÊý¾ÝÀÛ&frac14;Óµ&frac12;sum temp=sum/50; //Ìø³öÉÏÃæµÄforÑ­»·ºó£¬&frac12;«ÀÛ&frac14;ÓµÄ×ÜÊý³ýÒÔ50µÃµ&frac12;Æ&frac12;¾ùÖµtemp sum=0; //Æ&frac12;¾ùÖµ&frac14;ÆËãÍê³Éºó£¬&frac12;«×ÜÊýÇåÁã if(set==0) //Ö»ÓÐÔÚ·ÇÉèÖÃ״̬ʱ£¬ Display_1602(temp,WARNING); //²ÅË¢ÐÂÏÔʾʵʱŨ¶ÈÖµ if(temp<WARNING&&set==0) //·ÇÉèÖÃʱµ±Å¨¶ÈֵСÓÚ±¨¾¯ÖµÊ± { flag=0; //±¨¾¯±ê־λÖÃ0£¬²»±¨¾¯ } else if(temp>WARNING&&set==0) //·ÇÉèÖÃʱµ±Å¨¶ÈÖµ´óÓÚ±¨¾¯ÖµÊ± { flag=1; //±¨¾¯±ê־λÖÃ1 } Key(); //ɨÃè°´&frac14;ü } } void Key() //°´&frac14;üº¯Êý { if(Key1==0) //ÉèÖÃ&frac14;ü°´ÏÂʱ { while(Key1==0); //&frac14;ì²â°´&frac14;üÊÇ·ñÊÍ·Å FENG=0; //·äÃùÆ÷Ïì set++; //ÉèÖÃ״̬±êÖ¾&frac14;Ó flag=0; //Í£Ö&sup1;±¨¾¯ // san=1; //·çÉÈÍ£Ö&sup1;ת¶¯£¨Ñ¡Å䣩 TR0=0; //¶¨Ê±Æ÷Í£Ö&sup1; } if(set==1) //ÉèÖÃʱ { write_com(0x38);//ÆÁÄ»³õÊ&frac14;»¯ write_com(0x80+0x40+13);//Ñ¡Öб¨¾¯ÖµµÄλÖà write_com(0x0f);//´ò¿ªÏÔʾ ÎÞ&sup1;â±ê &sup1;â±êÉÁ˸ write_com(0x06);//µ±¶Á»òдһ¸ö×Ö·ûÊÇÖ¸Õëºóһһλ FENG=1; //·äÃùÆ÷Í£Ö&sup1;ÃùÏì } else if(set>=2) //ÔÙ°´Ò»ÏÂÉèÖÃ&frac14;üʱ£¬Í˳öÉèÖà { set=0; //ÉèÖÃ״̬ÇåÁã write_com(0x38);//ÆÁÄ»³õÊ&frac14;»¯ write_com(0x0c);//´ò¿ªÏÔʾ ÎÞ&sup1;â±ê ÎÞ&sup1;â±êÉÁ˸ FENG=1; //·äÃùÆ÷Í£Ö&sup1;Ïì flag=1; //±¨¾¯±ê־λÖÃ1 TR0=1; //¶¨Ê±Æ÷¿ªÊ&frac14;&frac14;ÆÊ± } if(Key2==0&&set!=0) //µ±ÔÚÉèÖÃ״̬ʱ£¬°´ÏÂ&frac14;Ó&frac14;üʱ { while(Key2==0); //°´&frac14;üÊÍ·Å FENG=0; //·äÃùÆ÷ÃùÏì WARNING++; //±¨¾¯ãÐÖµ&frac14;Ó if(WARNING>=255)//ãÐÖµ×î´ó&frac14;Óµ&frac12;255 WARNING=0; //ÇåÁã write_com(0x80+0x40+11); //ÔÚãÐÖµµÄλÖÃдÈëÉèÖõÄÊý¾Ý write_data('0'+WARNING/100); //ÏÔʾ°Ù루&frac12;«123³ýÒÔ100µÃµ&frac12;µÄÉÌÊÇ1£¬¾ÍÊǰÙλÊý¾Ý£©123ΪÀý×Ó write_data('0'+WARNING/10%10);//ÏÔʾʮ루&frac12;«123³ýÒÔ10µÃµ&frac12;ÉÌÊÇ12£¬&frac12;«12³ýÒÔ10µÄÓàÊý¾ÍÊÇʮ룩 write_data('0'+WARNING%10); //ÏÔʾ¸ö루&frac12;«123³ýÒÔ10µÄÓàÊý3¾ÍÊǸöλÊý¾Ý£©123ΪÀý×Ó write_com(0x80+0x40+13);//λÖà FENG=1;//·äÃùÆ÷Í£Ö&sup1; } if(Key3==0&&set!=0) //&frac14;õ°´&frac14;ü×¢ÊͲο&frac14;&frac14;Ó°´&frac14;ü²¿·Ö { while(Key3==0); FENG=0; WARNING--; if(WARNING<=0) WARNING=255; write_com(0x80+0x40+11); write_data('0'+WARNING/100); write_data('0'+WARNING/10%10); write_data('0'+WARNING%10); write_com(0x80+0x40+13);//λÖà FENG=1; } } void time1_int(void) interrupt 1 //¶¨Ê±Æ÷º¯Êý { uchar count; TL0=0xb0; TH0=0x3c; //ÖØÐ¸³³õÖµ count++; //&frac14;ÆÊ±±äÁ¿&frac14;Ó if(count==10)//¶¨Ê±Æ÷¶¨Ê±ÊÇ50ms£¬´Ë´¦&frac14;ÆÊý10´Î£¬ÕýºÃÊÇ500ms£¬ÓÃÓÚ±¨¾¯Ê± µÆÁÁºÍ·äÃùÆ÷Ïì { if(flag==0) //±¨¾¯±ê־Ϊ0ʱ { LED_G=0; //Â̵ÆÁÁ LED_R=1; //ºìµÆÃð FENG=1; //·äÃùÆ÷²»Ïì // san=1; //·çÉȲ»×ª£¨Ñ¡Å䣩 } if(flag==1) //±¨¾¯±ê־λΪ1ʱ { LED_G=1; //Â̵ÆÃð LED_R=0; //ºìµÆÁÁ FENG=0; //·äÃùÆ÷Ïì // san=0; //·çÉÈת¶¯£¨Ñ¡Å䣩 } } if(count==20) //&frac14;ÆÊýµ&frac12;20ʱ£¬ÕýºÃÊÇ1000ms£¬¾ÍÊÇ1s£¬ÕâÀï¾ÍÊÇÈõÆÃ𣬷äÃùÆ÷²»Ï죬´Ó¶ø×ö³öÉÁ˸µÄЧ&sup1;û { count=0; //&frac14;Ƶ&frac12;1sʱ£¬&frac12;«countÇåÁ㣬×&frac14;±¸ÖØÐÂ&frac14;ÆÊý if(flag==0) { LED_G=1; LED_R=1; FENG=1; // san=1; //È«²¿&sup1;Ø±Õ } if(flag==1) { LED_G=1; LED_R=1; FENG=1; // san=0; //±¨¾¯Öµ£¬·çÉÈÊÇһֱת¶¯µÄ£¨Ñ¡Å䣩 } } } 修改为下限报警
最新发布
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值