Compare commits
23 Commits
EPS_v1.0
...
Sun_sensor
Author | SHA1 | Date | |
---|---|---|---|
9379789877 | |||
a9d09bfaa9 | |||
d1edb2e57b | |||
6c162da888 | |||
3d05cfce6a | |||
19589400a1 | |||
49c14a56c4 | |||
701e221b50 | |||
7d07785093 | |||
91f55b5ff2 | |||
bdf51eeb18 | |||
fcbbcbb489 | |||
f73e69f170 | |||
d027248975 | |||
bed4265f2c | |||
687079755e | |||
aa6e0777dd | |||
4da5aefb5a | |||
a476a582f2 | |||
90fe5c37e2 | |||
f65d1936b9 | |||
e466a42f55 | |||
1607125f21 |
1
modules/Solar_module_XY/.gitignore
vendored
1
modules/Solar_module_XY/.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
Solar_module_XY-backups
|
Solar_module_XY-backups
|
||||||
|
gerbers/
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"board": {
|
"board": {
|
||||||
"active_layer": 31,
|
"active_layer": 36,
|
||||||
"active_layer_preset": "",
|
"active_layer_preset": "",
|
||||||
"auto_track_width": true,
|
"auto_track_width": true,
|
||||||
"hidden_nets": [],
|
"hidden_nets": [],
|
||||||
|
@ -55,7 +55,40 @@
|
|||||||
"width": 0.0
|
"width": 0.0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"drc_exclusions": [],
|
"drc_exclusions": [
|
||||||
|
"copper_edge_clearance|116934456|138502140|9d0b8179-d0da-4bfb-9b0b-05884f67af11|1428052b-1b91-48f4-824e-3ffe7c8d983c",
|
||||||
|
"copper_edge_clearance|116934456|88502140|12601d4d-9f6b-441d-bd90-fada6e4b87e5|3e42eef1-eeb6-4aff-96dc-99e9ebc36744",
|
||||||
|
"copper_edge_clearance|117000001|99500001|4c3fd363-83bd-4872-a414-a437b42b446f|211bf903-aa51-45df-8f81-81e60a0fdcb9",
|
||||||
|
"copper_edge_clearance|117350000|49500001|2f6d15c7-4477-4ad9-a200-c7308ef4b846|bd8e96df-a568-42d2-9127-3f9151a0b1d3",
|
||||||
|
"copper_edge_clearance|118650000|138500001|2d15909f-4f85-4a6a-8471-b6060751bdb3|51322c1d-6eb3-4b8b-9449-9c6c4ca0e95b",
|
||||||
|
"copper_edge_clearance|118650000|49500001|2f6d15c7-4477-4ad9-a200-c7308ef4b846|f7147224-08cf-484e-b7f5-890f2df5fc13",
|
||||||
|
"copper_edge_clearance|119000001|88500001|43a9bf09-97ca-4edd-9732-e421ab7ff713|9fd407b7-d7b5-4734-9240-5955d7ffea2a",
|
||||||
|
"copper_edge_clearance|119065546|99497862|3181f291-c5fb-41cb-a3ce-c0b352ce52ff|b6d9f025-7762-4469-961b-1e8ac433ef1b",
|
||||||
|
"copper_edge_clearance|129997862|116434456|5f9f3e52-3a57-4b5d-b25a-149abc970f24|9a76a1db-3449-4642-9a76-6cd7d00993b2",
|
||||||
|
"copper_edge_clearance|129997862|132934456|00e6beb7-1e10-497b-988c-c94ca5df12b1|ea5b6a1f-0336-4b12-89e2-514c3e35accf",
|
||||||
|
"copper_edge_clearance|129997862|52934456|e03c1ce5-98b0-456b-9561-277c930a2ea5|8de68402-e332-40ca-af61-6819171c2caa",
|
||||||
|
"copper_edge_clearance|129997862|69434456|5c9228a6-a03b-4ba7-b25b-d9626c5d0c7e|ddaa87cf-886c-4955-b20a-4ce9c579558e",
|
||||||
|
"copper_edge_clearance|130000001|118150000|da8b2bb9-3857-4c2f-bff9-6c2c29255ffc|72583e13-ef6b-467f-919f-59fb2fea1357",
|
||||||
|
"copper_edge_clearance|130000001|134650000|397bfb33-6c37-4a89-a4ee-95e5259e0966|554a0b8a-c728-45de-94a1-d08bace03100",
|
||||||
|
"copper_edge_clearance|130000001|54650000|96ae93f8-dc51-43ba-baf5-c024f2ea8338|19183b5b-a7c2-4cd4-b516-db96b706c68b",
|
||||||
|
"copper_edge_clearance|130000001|71150000|9fa21e4c-ed0f-42c6-8437-e7a91a901df1|b1a6c97b-29d1-4507-8619-cdfb147f5875",
|
||||||
|
"copper_edge_clearance|169000001|116850000|b552cb4c-5e26-47d2-a7dd-70ddf83450de|e9c928a4-0cad-4d84-9ac0-1660e3368772",
|
||||||
|
"copper_edge_clearance|169000001|133350000|8cf5aed7-5af9-4cf8-83ae-365c8a09b254|0991c516-7116-4e34-aa57-735f3323a8e9",
|
||||||
|
"copper_edge_clearance|169000001|53350000|030ef28a-29d4-4f58-92e8-740bf14ab01d|53348628-da08-49dd-aeb9-2a3713eb6ef9",
|
||||||
|
"copper_edge_clearance|169000001|69850000|efc20dda-f6f4-40c5-8d73-6f92846985c3|33afc8e0-1832-443b-b2ec-75f4e8f27ef0",
|
||||||
|
"copper_edge_clearance|169000001|71150000|efc20dda-f6f4-40c5-8d73-6f92846985c3|40a5b2cd-9ef0-44f6-9ec3-e731a817a511",
|
||||||
|
"copper_edge_clearance|169002140|118565546|c9d18ef9-6ceb-494a-bd16-bbde67e6ee7e|6e1847ce-cdfb-4d7c-892e-e057035165e7",
|
||||||
|
"copper_edge_clearance|169002140|135065546|640ecc8f-4847-4dfd-b9bc-f4992f4fe153|1dc2c3f1-276a-4de4-b0d2-7a9496cabab8",
|
||||||
|
"copper_edge_clearance|169002140|55065546|22ffcec7-c46b-4002-84e5-0af591b2b6ed|822788ca-96f7-43aa-958a-9d169661e9bd",
|
||||||
|
"copper_edge_clearance|180000001|49500001|f5b32b2b-9e4e-4ab9-9d7d-ffda471b6013|d8f70b9f-b671-43f3-9b15-73c9d4c69f1e",
|
||||||
|
"copper_edge_clearance|180000001|99500001|488c867e-a049-4c6d-9b5d-2265700d3176|00f0d83b-a1b8-4618-83ab-5651ce18eb75",
|
||||||
|
"copper_edge_clearance|180350000|138500001|9abcfb7c-fa8b-43a3-be55-1a2e51209738|123d0546-b585-4c58-8a1f-4204ee7cf2e0",
|
||||||
|
"copper_edge_clearance|180350000|88500001|a60d4a6f-bbf9-4b44-9f0c-7dec92f1ce58|79a58f44-63ed-46e6-a5c2-8a74d9b89481",
|
||||||
|
"copper_edge_clearance|181650000|138500001|9abcfb7c-fa8b-43a3-be55-1a2e51209738|2691039d-2c91-4e21-a062-099735c86c25",
|
||||||
|
"copper_edge_clearance|181650000|99500001|85d55c39-c34c-41c0-bc1f-dbfb726f47a1|3a26b561-357b-4837-93af-793d91125af3",
|
||||||
|
"copper_edge_clearance|182000001|88500001|8749c304-9e63-4b89-a582-447b685a9a75|f4f0d1cb-c307-4949-a6ba-9229d02342bc",
|
||||||
|
"copper_edge_clearance|182065546|49497862|7986647a-bda0-4498-8db8-01205c46a3c4|74fe8c6c-e22a-475f-9122-ef9a6763b49a"
|
||||||
|
],
|
||||||
"meta": {
|
"meta": {
|
||||||
"version": 2
|
"version": 2
|
||||||
},
|
},
|
||||||
@ -69,6 +102,7 @@
|
|||||||
"drill_out_of_range": "error",
|
"drill_out_of_range": "error",
|
||||||
"duplicate_footprints": "warning",
|
"duplicate_footprints": "warning",
|
||||||
"extra_footprint": "warning",
|
"extra_footprint": "warning",
|
||||||
|
"footprint_type_mismatch": "error",
|
||||||
"hole_clearance": "error",
|
"hole_clearance": "error",
|
||||||
"hole_near_hole": "error",
|
"hole_near_hole": "error",
|
||||||
"invalid_outline": "error",
|
"invalid_outline": "error",
|
||||||
@ -87,6 +121,7 @@
|
|||||||
"silk_over_copper": "error",
|
"silk_over_copper": "error",
|
||||||
"silk_overlap": "error",
|
"silk_overlap": "error",
|
||||||
"skew_out_of_range": "error",
|
"skew_out_of_range": "error",
|
||||||
|
"through_hole_pad_without_hole": "error",
|
||||||
"too_many_vias": "error",
|
"too_many_vias": "error",
|
||||||
"track_dangling": "warning",
|
"track_dangling": "warning",
|
||||||
"track_width": "error",
|
"track_width": "error",
|
||||||
@ -315,6 +350,7 @@
|
|||||||
],
|
],
|
||||||
"rule_severities": {
|
"rule_severities": {
|
||||||
"bus_definition_conflict": "error",
|
"bus_definition_conflict": "error",
|
||||||
|
"bus_entry_needed": "error",
|
||||||
"bus_label_syntax": "error",
|
"bus_label_syntax": "error",
|
||||||
"bus_to_bus_conflict": "error",
|
"bus_to_bus_conflict": "error",
|
||||||
"bus_to_net_conflict": "error",
|
"bus_to_net_conflict": "error",
|
||||||
@ -371,7 +407,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"meta": {
|
"meta": {
|
||||||
"version": 1
|
"version": 2
|
||||||
},
|
},
|
||||||
"net_colors": null
|
"net_colors": null
|
||||||
},
|
},
|
||||||
@ -384,9 +420,10 @@
|
|||||||
"step": "Solar_module_XY.step",
|
"step": "Solar_module_XY.step",
|
||||||
"vrml": ""
|
"vrml": ""
|
||||||
},
|
},
|
||||||
"page_layout_descr_file": "/home/petr/work/butcube/kicad_page_layout.kicad_wks"
|
"page_layout_descr_file": "/home/petr/work/butcube/resources/kicad_page_layout.kicad_wks"
|
||||||
},
|
},
|
||||||
"schematic": {
|
"schematic": {
|
||||||
|
"annotate_start_num": 0,
|
||||||
"drawing": {
|
"drawing": {
|
||||||
"default_bus_thickness": 12.0,
|
"default_bus_thickness": 12.0,
|
||||||
"default_junction_size": 40.0,
|
"default_junction_size": 40.0,
|
||||||
@ -400,23 +437,26 @@
|
|||||||
"intersheets_ref_show": false,
|
"intersheets_ref_show": false,
|
||||||
"intersheets_ref_suffix": "",
|
"intersheets_ref_suffix": "",
|
||||||
"junction_size_choice": 3,
|
"junction_size_choice": 3,
|
||||||
|
"label_size_ratio": 0.3,
|
||||||
"pin_symbol_size": 25.0,
|
"pin_symbol_size": 25.0,
|
||||||
"text_offset_ratio": 0.3
|
"text_offset_ratio": 0.3
|
||||||
},
|
},
|
||||||
"legacy_lib_dir": "",
|
"legacy_lib_dir": "",
|
||||||
"legacy_lib_list": [],
|
"legacy_lib_list": [],
|
||||||
"meta": {
|
"meta": {
|
||||||
"version": 0
|
"version": 1
|
||||||
},
|
},
|
||||||
"net_format_name": "",
|
"net_format_name": "",
|
||||||
"ngspice": {
|
"ngspice": {
|
||||||
|
"fix_include_paths": true,
|
||||||
|
"fix_passive_vals": false,
|
||||||
"meta": {
|
"meta": {
|
||||||
"version": 0
|
"version": 0
|
||||||
},
|
},
|
||||||
"model_mode": 0,
|
"model_mode": 0,
|
||||||
"workbook_filename": ""
|
"workbook_filename": ""
|
||||||
},
|
},
|
||||||
"page_layout_descr_file": "/home/petr/work/butcube/kicad_page_layout.kicad_wks",
|
"page_layout_descr_file": "/home/petr/work/butcube/resources/kicad_page_layout.kicad_wks",
|
||||||
"plot_directory": "",
|
"plot_directory": "",
|
||||||
"spice_adjust_passive_values": false,
|
"spice_adjust_passive_values": false,
|
||||||
"spice_external_command": "spice \"%I\"",
|
"spice_external_command": "spice \"%I\"",
|
||||||
@ -435,14 +475,6 @@
|
|||||||
[
|
[
|
||||||
"22eee9c3-c9d0-4d93-be59-be741d8b9bee",
|
"22eee9c3-c9d0-4d93-be59-be741d8b9bee",
|
||||||
"Solar_unit_1"
|
"Solar_unit_1"
|
||||||
],
|
|
||||||
[
|
|
||||||
"53e9ff4e-ea34-4280-9514-a003468a008c",
|
|
||||||
"Solar_unit_4"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"dcd95010-e092-4767-a18b-c97e6c93d4a6",
|
|
||||||
"Solar_unit_3"
|
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"text_variables": {}
|
"text_variables": {}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,12 +1,12 @@
|
|||||||
(kicad_sch (version 20210406) (generator eeschema)
|
(kicad_sch (version 20211123) (generator eeschema)
|
||||||
|
|
||||||
(uuid f07b4407-9283-4b53-a6ba-203b6b1b572a)
|
(uuid f07b4407-9283-4b53-a6ba-203b6b1b572a)
|
||||||
|
|
||||||
(paper "A4")
|
(paper "A4")
|
||||||
|
|
||||||
(title_block
|
(title_block
|
||||||
(title "BUCube - Solar module Z")
|
(title "BUCube - Solar module XY")
|
||||||
(date "2021-06-01")
|
(date "2022-01-20")
|
||||||
(rev "v1.0")
|
(rev "v1.0")
|
||||||
(company "VUT")
|
(company "VUT")
|
||||||
(comment 1 "Author: Petr Malaník")
|
(comment 1 "Author: Petr Malaník")
|
||||||
@ -41,14 +41,16 @@
|
|||||||
(xy -2.032 -0.762)
|
(xy -2.032 -0.762)
|
||||||
(xy 2.032 -0.762)
|
(xy 2.032 -0.762)
|
||||||
)
|
)
|
||||||
(stroke (width 0.508)) (fill (type none))
|
(stroke (width 0.508) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type none))
|
||||||
)
|
)
|
||||||
(polyline
|
(polyline
|
||||||
(pts
|
(pts
|
||||||
(xy -2.032 0.762)
|
(xy -2.032 0.762)
|
||||||
(xy 2.032 0.762)
|
(xy 2.032 0.762)
|
||||||
)
|
)
|
||||||
(stroke (width 0.508)) (fill (type none))
|
(stroke (width 0.508) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type none))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(symbol "C_1_1"
|
(symbol "C_1_1"
|
||||||
@ -83,52 +85,60 @@
|
|||||||
)
|
)
|
||||||
(symbol "Solar_Cell_0_1"
|
(symbol "Solar_Cell_0_1"
|
||||||
(rectangle (start -2.032 1.778) (end 2.032 1.524)
|
(rectangle (start -2.032 1.778) (end 2.032 1.524)
|
||||||
(stroke (width 0)) (fill (type outline))
|
(stroke (width 0) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type outline))
|
||||||
)
|
)
|
||||||
(rectangle (start -1.3208 1.1938) (end 1.27 0.6858)
|
(rectangle (start -1.3208 1.1938) (end 1.27 0.6858)
|
||||||
(stroke (width 0)) (fill (type outline))
|
(stroke (width 0) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type outline))
|
||||||
)
|
)
|
||||||
(polyline
|
(polyline
|
||||||
(pts
|
(pts
|
||||||
(xy -2.032 2.286)
|
(xy -2.032 2.286)
|
||||||
(xy -3.556 3.81)
|
(xy -3.556 3.81)
|
||||||
)
|
)
|
||||||
(stroke (width 0)) (fill (type none))
|
(stroke (width 0) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type none))
|
||||||
)
|
)
|
||||||
(polyline
|
(polyline
|
||||||
(pts
|
(pts
|
||||||
(xy -0.762 2.794)
|
(xy -0.762 2.794)
|
||||||
(xy -2.286 4.318)
|
(xy -2.286 4.318)
|
||||||
)
|
)
|
||||||
(stroke (width 0)) (fill (type none))
|
(stroke (width 0) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type none))
|
||||||
)
|
)
|
||||||
(polyline
|
(polyline
|
||||||
(pts
|
(pts
|
||||||
(xy 0 0.762)
|
(xy 0 0.762)
|
||||||
(xy 0 0)
|
(xy 0 0)
|
||||||
)
|
)
|
||||||
(stroke (width 0)) (fill (type none))
|
(stroke (width 0) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type none))
|
||||||
)
|
)
|
||||||
(polyline
|
(polyline
|
||||||
(pts
|
(pts
|
||||||
(xy 0 1.778)
|
(xy 0 1.778)
|
||||||
(xy 0 2.54)
|
(xy 0 2.54)
|
||||||
)
|
)
|
||||||
(stroke (width 0)) (fill (type none))
|
(stroke (width 0) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type none))
|
||||||
)
|
)
|
||||||
(polyline
|
(polyline
|
||||||
(pts
|
(pts
|
||||||
(xy 0.254 2.667)
|
(xy 0.254 2.667)
|
||||||
(xy 1.27 2.667)
|
(xy 1.27 2.667)
|
||||||
)
|
)
|
||||||
(stroke (width 0.254)) (fill (type none))
|
(stroke (width 0.254) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type none))
|
||||||
)
|
)
|
||||||
(polyline
|
(polyline
|
||||||
(pts
|
(pts
|
||||||
(xy 0.762 3.175)
|
(xy 0.762 3.175)
|
||||||
(xy 0.762 2.159)
|
(xy 0.762 2.159)
|
||||||
)
|
)
|
||||||
(stroke (width 0.254)) (fill (type none))
|
(stroke (width 0.254) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type none))
|
||||||
)
|
)
|
||||||
(polyline
|
(polyline
|
||||||
(pts
|
(pts
|
||||||
@ -136,7 +146,8 @@
|
|||||||
(xy -2.032 2.286)
|
(xy -2.032 2.286)
|
||||||
(xy -2.794 2.286)
|
(xy -2.794 2.286)
|
||||||
)
|
)
|
||||||
(stroke (width 0)) (fill (type none))
|
(stroke (width 0) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type none))
|
||||||
)
|
)
|
||||||
(polyline
|
(polyline
|
||||||
(pts
|
(pts
|
||||||
@ -144,7 +155,8 @@
|
|||||||
(xy -0.762 2.794)
|
(xy -0.762 2.794)
|
||||||
(xy -1.524 2.794)
|
(xy -1.524 2.794)
|
||||||
)
|
)
|
||||||
(stroke (width 0)) (fill (type none))
|
(stroke (width 0) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type none))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(symbol "Solar_Cell_1_1"
|
(symbol "Solar_Cell_1_1"
|
||||||
@ -179,7 +191,8 @@
|
|||||||
)
|
)
|
||||||
(symbol "LM66100_0_1"
|
(symbol "LM66100_0_1"
|
||||||
(rectangle (start -6.35 5.08) (end 6.35 -5.08)
|
(rectangle (start -6.35 5.08) (end 6.35 -5.08)
|
||||||
(stroke (width 0.254)) (fill (type background))
|
(stroke (width 0.254) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type background))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(symbol "LM66100_1_1"
|
(symbol "LM66100_1_1"
|
||||||
@ -192,7 +205,7 @@
|
|||||||
(number "2" (effects (font (size 1.27 1.27))))
|
(number "2" (effects (font (size 1.27 1.27))))
|
||||||
)
|
)
|
||||||
(pin input line (at -8.89 -2.54 0) (length 2.54)
|
(pin input line (at -8.89 -2.54 0) (length 2.54)
|
||||||
(name "~CE" (effects (font (size 1.27 1.27))))
|
(name "~{CE}" (effects (font (size 1.27 1.27))))
|
||||||
(number "3" (effects (font (size 1.27 1.27))))
|
(number "3" (effects (font (size 1.27 1.27))))
|
||||||
)
|
)
|
||||||
(pin output line (at 8.89 -2.54 180) (length 2.54)
|
(pin output line (at 8.89 -2.54 180) (length 2.54)
|
||||||
@ -234,7 +247,8 @@
|
|||||||
(xy -1.27 -1.27)
|
(xy -1.27 -1.27)
|
||||||
(xy 0 -1.27)
|
(xy 0 -1.27)
|
||||||
)
|
)
|
||||||
(stroke (width 0)) (fill (type none))
|
(stroke (width 0) (type default) (color 0 0 0 0))
|
||||||
|
(fill (type none))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(symbol "GND_1_1"
|
(symbol "GND_1_1"
|
||||||
@ -246,9 +260,49 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
(junction (at 99.06 90.17) (diameter 1.016) (color 0 0 0 0))
|
(junction (at 99.06 90.17) (diameter 1.016) (color 0 0 0 0)
|
||||||
(junction (at 128.27 90.17) (diameter 1.016) (color 0 0 0 0))
|
(uuid 97998cb6-a494-40b7-8bbd-7df2c034b907)
|
||||||
|
)
|
||||||
|
(junction (at 128.27 90.17) (diameter 1.016) (color 0 0 0 0)
|
||||||
|
(uuid be4513c3-ecf4-4a57-a371-71a60e51a3f0)
|
||||||
|
)
|
||||||
|
|
||||||
|
(wire (pts (xy 99.06 99.06) (xy 99.06 100.33))
|
||||||
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
|
(uuid 0a950af6-1312-414c-95d7-6621778b7135)
|
||||||
|
)
|
||||||
|
(wire (pts (xy 99.06 90.17) (xy 99.06 91.44))
|
||||||
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
|
(uuid 14eb2a95-3c22-4d0c-9be0-b89a37d459f9)
|
||||||
|
)
|
||||||
|
(wire (pts (xy 85.09 99.06) (xy 85.09 101.6))
|
||||||
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
|
(uuid 15b85bef-7550-45f9-be3b-c0a8c90f7200)
|
||||||
|
)
|
||||||
|
(wire (pts (xy 128.27 90.17) (xy 134.62 90.17))
|
||||||
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
|
(uuid 7c5f2db0-21c3-45fc-bc73-ce414a62eb56)
|
||||||
|
)
|
||||||
|
(wire (pts (xy 105.41 95.25) (xy 105.41 104.14))
|
||||||
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
|
(uuid 887cbb09-1f15-43a8-acfc-207e7e7a34ba)
|
||||||
|
)
|
||||||
|
(wire (pts (xy 105.41 104.14) (xy 128.27 104.14))
|
||||||
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
|
(uuid 887cbb09-1f15-43a8-acfc-207e7e7a34bb)
|
||||||
|
)
|
||||||
|
(wire (pts (xy 128.27 90.17) (xy 123.19 90.17))
|
||||||
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
|
(uuid 887cbb09-1f15-43a8-acfc-207e7e7a34bc)
|
||||||
|
)
|
||||||
|
(wire (pts (xy 128.27 104.14) (xy 128.27 90.17))
|
||||||
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
|
(uuid 887cbb09-1f15-43a8-acfc-207e7e7a34bd)
|
||||||
|
)
|
||||||
|
(wire (pts (xy 85.09 109.22) (xy 85.09 111.76))
|
||||||
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
|
(uuid 9d571d20-99ec-429e-a321-8982be849846)
|
||||||
|
)
|
||||||
(wire (pts (xy 85.09 90.17) (xy 85.09 91.44))
|
(wire (pts (xy 85.09 90.17) (xy 85.09 91.44))
|
||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
(uuid a19d51ce-09ff-4763-8bd8-9f19b46659be)
|
(uuid a19d51ce-09ff-4763-8bd8-9f19b46659be)
|
||||||
@ -257,29 +311,13 @@
|
|||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
(uuid d40f41ea-4180-45af-883f-0765adafcf20)
|
(uuid d40f41ea-4180-45af-883f-0765adafcf20)
|
||||||
)
|
)
|
||||||
(wire (pts (xy 85.09 99.06) (xy 85.09 101.6))
|
|
||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
|
||||||
(uuid 15b85bef-7550-45f9-be3b-c0a8c90f7200)
|
|
||||||
)
|
|
||||||
(wire (pts (xy 99.06 90.17) (xy 99.06 91.44))
|
|
||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
|
||||||
(uuid 14eb2a95-3c22-4d0c-9be0-b89a37d459f9)
|
|
||||||
)
|
|
||||||
(wire (pts (xy 99.06 90.17) (xy 105.41 90.17))
|
(wire (pts (xy 99.06 90.17) (xy 105.41 90.17))
|
||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
(uuid d40f41ea-4180-45af-883f-0765adafcf20)
|
(uuid d40f41ea-4180-45af-883f-0765adafcf21)
|
||||||
)
|
)
|
||||||
(wire (pts (xy 99.06 99.06) (xy 99.06 100.33))
|
(wire (pts (xy 85.09 119.38) (xy 85.09 121.92))
|
||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
(uuid 0a950af6-1312-414c-95d7-6621778b7135)
|
(uuid f4a91bb3-c792-4909-b481-5f766c12d04f)
|
||||||
)
|
|
||||||
(wire (pts (xy 105.41 95.25) (xy 105.41 104.14))
|
|
||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
|
||||||
(uuid 887cbb09-1f15-43a8-acfc-207e7e7a34ba)
|
|
||||||
)
|
|
||||||
(wire (pts (xy 105.41 104.14) (xy 128.27 104.14))
|
|
||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
|
||||||
(uuid 887cbb09-1f15-43a8-acfc-207e7e7a34ba)
|
|
||||||
)
|
)
|
||||||
(wire (pts (xy 124.46 95.25) (xy 123.19 95.25))
|
(wire (pts (xy 124.46 95.25) (xy 123.19 95.25))
|
||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
@ -287,19 +325,7 @@
|
|||||||
)
|
)
|
||||||
(wire (pts (xy 124.46 100.33) (xy 124.46 95.25))
|
(wire (pts (xy 124.46 100.33) (xy 124.46 95.25))
|
||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
(stroke (width 0) (type solid) (color 0 0 0 0))
|
||||||
(uuid f6000d72-d9f2-447c-bfe6-6e5a597bebc9)
|
(uuid f6000d72-d9f2-447c-bfe6-6e5a597bebca)
|
||||||
)
|
|
||||||
(wire (pts (xy 128.27 90.17) (xy 123.19 90.17))
|
|
||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
|
||||||
(uuid 887cbb09-1f15-43a8-acfc-207e7e7a34ba)
|
|
||||||
)
|
|
||||||
(wire (pts (xy 128.27 90.17) (xy 134.62 90.17))
|
|
||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
|
||||||
(uuid 7c5f2db0-21c3-45fc-bc73-ce414a62eb56)
|
|
||||||
)
|
|
||||||
(wire (pts (xy 128.27 104.14) (xy 128.27 90.17))
|
|
||||||
(stroke (width 0) (type solid) (color 0 0 0 0))
|
|
||||||
(uuid 887cbb09-1f15-43a8-acfc-207e7e7a34ba)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
(hierarchical_label "OUT" (shape input) (at 134.62 90.17 0)
|
(hierarchical_label "OUT" (shape input) (at 134.62 90.17 0)
|
||||||
@ -307,46 +333,29 @@
|
|||||||
(uuid 69e3588f-e815-46f8-b7ce-6f605a0c9e5c)
|
(uuid 69e3588f-e815-46f8-b7ce-6f605a0c9e5c)
|
||||||
)
|
)
|
||||||
|
|
||||||
(symbol (lib_id "power:GND") (at 85.09 109.22 0)
|
(symbol (lib_id "Device:Solar_Cell") (at 85.09 106.68 0)
|
||||||
(in_bom yes) (on_board yes) (fields_autoplaced)
|
(in_bom yes) (on_board yes)
|
||||||
(uuid 3b8f2ef0-559a-4bbb-b1b1-a793b965aa19)
|
(uuid 0348ac21-372c-4d21-8b02-7758ba9a4bbd)
|
||||||
(property "Reference" "#PWR0149" (id 0) (at 85.09 115.57 0)
|
(property "Reference" "SC6" (id 0) (at 75.0571 104.6491 0)
|
||||||
|
(effects (font (size 1.27 1.27)) (justify left))
|
||||||
|
)
|
||||||
|
(property "Value" "SM141K04L" (id 1) (at 71.2471 106.9478 0)
|
||||||
|
(effects (font (size 1.27 1.27)) (justify left))
|
||||||
|
)
|
||||||
|
(property "Footprint" "TCY_solar:SM141K04LV" (id 2) (at 85.09 105.156 90)
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
)
|
)
|
||||||
(property "Value" "GND" (id 1) (at 85.09 113.5444 0)
|
(property "Datasheet" "~" (id 3) (at 85.09 105.156 90)
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
)
|
)
|
||||||
(property "Footprint" "" (id 2) (at 85.09 109.22 0)
|
(pin "1" (uuid ca2ccbf6-b2e5-4a9b-bc4d-684ed27bf55b))
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
(pin "2" (uuid e3b3ed30-1099-4d12-baa1-34038895f97e))
|
||||||
)
|
|
||||||
(property "Datasheet" "" (id 3) (at 85.09 109.22 0)
|
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
|
||||||
)
|
|
||||||
(pin "1" (uuid df9a530b-a451-4750-a2a9-ecdb9baf4a7b))
|
|
||||||
)
|
|
||||||
|
|
||||||
(symbol (lib_id "power:GND") (at 99.06 100.33 0)
|
|
||||||
(in_bom yes) (on_board yes) (fields_autoplaced)
|
|
||||||
(uuid 23967b27-4826-44d0-861c-6940554d5463)
|
|
||||||
(property "Reference" "#PWR0152" (id 0) (at 99.06 106.68 0)
|
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
|
||||||
)
|
|
||||||
(property "Value" "GND" (id 1) (at 99.06 104.6544 0)
|
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
|
||||||
)
|
|
||||||
(property "Footprint" "" (id 2) (at 99.06 100.33 0)
|
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
|
||||||
)
|
|
||||||
(property "Datasheet" "" (id 3) (at 99.06 100.33 0)
|
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
|
||||||
)
|
|
||||||
(pin "1" (uuid 69933c30-96f3-4687-a9c3-129175464b17))
|
|
||||||
)
|
)
|
||||||
|
|
||||||
(symbol (lib_id "power:GND") (at 114.3 100.33 0)
|
(symbol (lib_id "power:GND") (at 114.3 100.33 0)
|
||||||
(in_bom yes) (on_board yes) (fields_autoplaced)
|
(in_bom yes) (on_board yes) (fields_autoplaced)
|
||||||
(uuid 048d78ec-a044-483f-b782-0942fd867e33)
|
(uuid 048d78ec-a044-483f-b782-0942fd867e33)
|
||||||
(property "Reference" "#PWR0151" (id 0) (at 114.3 106.68 0)
|
(property "Reference" "#PWR049" (id 0) (at 114.3 106.68 0)
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
)
|
)
|
||||||
(property "Value" "GND" (id 1) (at 114.3 104.6544 0)
|
(property "Value" "GND" (id 1) (at 114.3 104.6544 0)
|
||||||
@ -361,10 +370,64 @@
|
|||||||
(pin "1" (uuid 4f591fec-8771-4414-afc9-222c56939f82))
|
(pin "1" (uuid 4f591fec-8771-4414-afc9-222c56939f82))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
(symbol (lib_id "power:GND") (at 99.06 100.33 0)
|
||||||
|
(in_bom yes) (on_board yes) (fields_autoplaced)
|
||||||
|
(uuid 23967b27-4826-44d0-861c-6940554d5463)
|
||||||
|
(property "Reference" "#PWR048" (id 0) (at 99.06 106.68 0)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(property "Value" "GND" (id 1) (at 99.06 104.6544 0)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(property "Footprint" "" (id 2) (at 99.06 100.33 0)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(property "Datasheet" "" (id 3) (at 99.06 100.33 0)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(pin "1" (uuid 69933c30-96f3-4687-a9c3-129175464b17))
|
||||||
|
)
|
||||||
|
|
||||||
|
(symbol (lib_id "TCY_power_management:LM66100") (at 114.3 92.71 0)
|
||||||
|
(in_bom yes) (on_board yes) (fields_autoplaced)
|
||||||
|
(uuid 30946d46-6cd3-49a1-94ab-464d3efaadf4)
|
||||||
|
(property "Reference" "U5" (id 0) (at 114.3 84.1968 0))
|
||||||
|
(property "Value" "LM66100" (id 1) (at 114.3 86.4955 0))
|
||||||
|
(property "Footprint" "Package_TO_SOT_SMD:SOT-363_SC-70-6" (id 2) (at 114.3 110.49 0)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(property "Datasheet" "https://www.ti.com/lit/ds/symlink/lm66100.pdf?ts=1611216893994&ref_url=https%253A%252F%252Fwww.google.com%252F" (id 3) (at 114.3 114.3 0)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(pin "1" (uuid 21bc264f-1adc-4c29-87bb-ef8b761f4a60))
|
||||||
|
(pin "2" (uuid 92fb66b3-6ee5-4a82-8100-735a257bf132))
|
||||||
|
(pin "3" (uuid 463a84e0-995a-4228-8d71-08eb9fc534af))
|
||||||
|
(pin "5" (uuid c6158a69-4803-4018-b7e3-682381779d8c))
|
||||||
|
(pin "6" (uuid 50a2a776-0876-4d9e-aac5-91da2605abb4))
|
||||||
|
)
|
||||||
|
|
||||||
|
(symbol (lib_id "power:GND") (at 85.09 129.54 0)
|
||||||
|
(in_bom yes) (on_board yes) (fields_autoplaced)
|
||||||
|
(uuid 3b8f2ef0-559a-4bbb-b1b1-a793b965aa19)
|
||||||
|
(property "Reference" "#PWR047" (id 0) (at 85.09 135.89 0)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(property "Value" "GND" (id 1) (at 85.09 133.8644 0)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(property "Footprint" "" (id 2) (at 85.09 129.54 0)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(property "Datasheet" "" (id 3) (at 85.09 129.54 0)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(pin "1" (uuid df9a530b-a451-4750-a2a9-ecdb9baf4a7b))
|
||||||
|
)
|
||||||
|
|
||||||
(symbol (lib_id "power:GND") (at 124.46 100.33 0)
|
(symbol (lib_id "power:GND") (at 124.46 100.33 0)
|
||||||
(in_bom yes) (on_board yes) (fields_autoplaced)
|
(in_bom yes) (on_board yes) (fields_autoplaced)
|
||||||
(uuid 855ea265-cf0f-467a-b7fb-994a04472f00)
|
(uuid 855ea265-cf0f-467a-b7fb-994a04472f00)
|
||||||
(property "Reference" "#PWR0150" (id 0) (at 124.46 106.68 0)
|
(property "Reference" "#PWR050" (id 0) (at 124.46 106.68 0)
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
)
|
)
|
||||||
(property "Value" "GND" (id 1) (at 124.46 104.6544 0)
|
(property "Value" "GND" (id 1) (at 124.46 104.6544 0)
|
||||||
@ -379,6 +442,44 @@
|
|||||||
(pin "1" (uuid 3aa8aad3-b63f-46d8-a9a4-e8af144a499f))
|
(pin "1" (uuid 3aa8aad3-b63f-46d8-a9a4-e8af144a499f))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
(symbol (lib_id "Device:Solar_Cell") (at 85.09 116.84 0)
|
||||||
|
(in_bom yes) (on_board yes)
|
||||||
|
(uuid e00dc2dc-888b-476a-a6ba-087fab879145)
|
||||||
|
(property "Reference" "SC7" (id 0) (at 75.0571 114.8091 0)
|
||||||
|
(effects (font (size 1.27 1.27)) (justify left))
|
||||||
|
)
|
||||||
|
(property "Value" "SM141K04L" (id 1) (at 71.2471 117.1078 0)
|
||||||
|
(effects (font (size 1.27 1.27)) (justify left))
|
||||||
|
)
|
||||||
|
(property "Footprint" "TCY_solar:SM141K04LV" (id 2) (at 85.09 115.316 90)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(property "Datasheet" "~" (id 3) (at 85.09 115.316 90)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(pin "1" (uuid 1db5ee0a-1faa-4892-be81-e1af9e9280d7))
|
||||||
|
(pin "2" (uuid 8488e29d-c288-41ef-98a7-272be9ef7cc5))
|
||||||
|
)
|
||||||
|
|
||||||
|
(symbol (lib_id "Device:Solar_Cell") (at 85.09 127 0)
|
||||||
|
(in_bom yes) (on_board yes)
|
||||||
|
(uuid e7ba0631-8a32-4cf8-b1e0-7389be80c395)
|
||||||
|
(property "Reference" "SC8" (id 0) (at 75.0571 124.9691 0)
|
||||||
|
(effects (font (size 1.27 1.27)) (justify left))
|
||||||
|
)
|
||||||
|
(property "Value" "SM141K04L" (id 1) (at 71.2471 127.2678 0)
|
||||||
|
(effects (font (size 1.27 1.27)) (justify left))
|
||||||
|
)
|
||||||
|
(property "Footprint" "TCY_solar:SM141K04LV" (id 2) (at 85.09 125.476 90)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(property "Datasheet" "~" (id 3) (at 85.09 125.476 90)
|
||||||
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
|
)
|
||||||
|
(pin "1" (uuid 76df5a64-5382-4fe2-83b7-16168e290617))
|
||||||
|
(pin "2" (uuid 2cd22269-6904-465f-b343-92420b748c73))
|
||||||
|
)
|
||||||
|
|
||||||
(symbol (lib_id "Device:C") (at 99.06 95.25 0)
|
(symbol (lib_id "Device:C") (at 99.06 95.25 0)
|
||||||
(in_bom yes) (on_board yes)
|
(in_bom yes) (on_board yes)
|
||||||
(uuid ee08ea61-0c8e-460a-9877-62d6a6cd5886)
|
(uuid ee08ea61-0c8e-460a-9877-62d6a6cd5886)
|
||||||
@ -401,13 +502,13 @@
|
|||||||
(symbol (lib_id "Device:Solar_Cell") (at 85.09 96.52 0)
|
(symbol (lib_id "Device:Solar_Cell") (at 85.09 96.52 0)
|
||||||
(in_bom yes) (on_board yes)
|
(in_bom yes) (on_board yes)
|
||||||
(uuid f5a0f36c-e5f8-4dd9-8887-885f56ec2a71)
|
(uuid f5a0f36c-e5f8-4dd9-8887-885f56ec2a71)
|
||||||
(property "Reference" "SC7" (id 0) (at 75.0571 94.4891 0)
|
(property "Reference" "SC5" (id 0) (at 75.0571 94.4891 0)
|
||||||
(effects (font (size 1.27 1.27)) (justify left))
|
(effects (font (size 1.27 1.27)) (justify left))
|
||||||
)
|
)
|
||||||
(property "Value" "SM141K04L" (id 1) (at 71.2471 96.7878 0)
|
(property "Value" "SM141K04L" (id 1) (at 71.2471 96.7878 0)
|
||||||
(effects (font (size 1.27 1.27)) (justify left))
|
(effects (font (size 1.27 1.27)) (justify left))
|
||||||
)
|
)
|
||||||
(property "Footprint" "TCY_solar:SM141K04L" (id 2) (at 85.09 94.996 90)
|
(property "Footprint" "TCY_solar:SM141K04LV" (id 2) (at 85.09 94.996 90)
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
(effects (font (size 1.27 1.27)) hide)
|
||||||
)
|
)
|
||||||
(property "Datasheet" "~" (id 3) (at 85.09 94.996 90)
|
(property "Datasheet" "~" (id 3) (at 85.09 94.996 90)
|
||||||
@ -416,41 +517,4 @@
|
|||||||
(pin "1" (uuid 3b156bda-6651-44cd-a108-773d3583d215))
|
(pin "1" (uuid 3b156bda-6651-44cd-a108-773d3583d215))
|
||||||
(pin "2" (uuid 4a941a7f-d1dd-482e-86bb-d6fbc2131969))
|
(pin "2" (uuid 4a941a7f-d1dd-482e-86bb-d6fbc2131969))
|
||||||
)
|
)
|
||||||
|
|
||||||
(symbol (lib_id "Device:Solar_Cell") (at 85.09 106.68 0)
|
|
||||||
(in_bom yes) (on_board yes)
|
|
||||||
(uuid 0348ac21-372c-4d21-8b02-7758ba9a4bbd)
|
|
||||||
(property "Reference" "SC8" (id 0) (at 75.0571 104.6491 0)
|
|
||||||
(effects (font (size 1.27 1.27)) (justify left))
|
|
||||||
)
|
|
||||||
(property "Value" "SM141K04L" (id 1) (at 71.2471 106.9478 0)
|
|
||||||
(effects (font (size 1.27 1.27)) (justify left))
|
|
||||||
)
|
|
||||||
(property "Footprint" "TCY_solar:SM141K04L" (id 2) (at 85.09 105.156 90)
|
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
|
||||||
)
|
|
||||||
(property "Datasheet" "~" (id 3) (at 85.09 105.156 90)
|
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
|
||||||
)
|
|
||||||
(pin "1" (uuid ca2ccbf6-b2e5-4a9b-bc4d-684ed27bf55b))
|
|
||||||
(pin "2" (uuid e3b3ed30-1099-4d12-baa1-34038895f97e))
|
|
||||||
)
|
|
||||||
|
|
||||||
(symbol (lib_id "TCY_power_management:LM66100") (at 114.3 92.71 0)
|
|
||||||
(in_bom yes) (on_board yes) (fields_autoplaced)
|
|
||||||
(uuid 30946d46-6cd3-49a1-94ab-464d3efaadf4)
|
|
||||||
(property "Reference" "U7" (id 0) (at 114.3 84.1968 0))
|
|
||||||
(property "Value" "LM66100" (id 1) (at 114.3 86.4955 0))
|
|
||||||
(property "Footprint" "Package_TO_SOT_SMD:SOT-363_SC-70-6" (id 2) (at 114.3 110.49 0)
|
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
|
||||||
)
|
|
||||||
(property "Datasheet" "https://www.ti.com/lit/ds/symlink/lm66100.pdf?ts=1611216893994&ref_url=https%253A%252F%252Fwww.google.com%252F" (id 3) (at 114.3 114.3 0)
|
|
||||||
(effects (font (size 1.27 1.27)) hide)
|
|
||||||
)
|
|
||||||
(pin "1" (uuid 21bc264f-1adc-4c29-87bb-ef8b761f4a60))
|
|
||||||
(pin "2" (uuid 92fb66b3-6ee5-4a82-8100-735a257bf132))
|
|
||||||
(pin "3" (uuid 463a84e0-995a-4228-8d71-08eb9fc534af))
|
|
||||||
(pin "5" (uuid c6158a69-4803-4018-b7e3-682381779d8c))
|
|
||||||
(pin "6" (uuid 50a2a776-0876-4d9e-aac5-91da2605abb4))
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
File diff suppressed because it is too large
Load Diff
5
modules/Sun_sensor/.gitignore
vendored
Normal file
5
modules/Sun_sensor/.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
Sun_sensor-backups/
|
||||||
|
gerbers/
|
||||||
|
bom/
|
||||||
|
replicate_layout.log
|
||||||
|
*.bak
|
6714
modules/Sun_sensor/Board_edges.dxf
Normal file
6714
modules/Sun_sensor/Board_edges.dxf
Normal file
File diff suppressed because it is too large
Load Diff
1333
modules/Sun_sensor/Stencil.step
Normal file
1333
modules/Sun_sensor/Stencil.step
Normal file
File diff suppressed because it is too large
Load Diff
7746
modules/Sun_sensor/Stencil_edges.dxf
Normal file
7746
modules/Sun_sensor/Stencil_edges.dxf
Normal file
File diff suppressed because it is too large
Load Diff
17820
modules/Sun_sensor/Sun_sensor.kicad_pcb
Normal file
17820
modules/Sun_sensor/Sun_sensor.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
75
modules/Sun_sensor/Sun_sensor.kicad_prl
Normal file
75
modules/Sun_sensor/Sun_sensor.kicad_prl
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
{
|
||||||
|
"board": {
|
||||||
|
"active_layer": 0,
|
||||||
|
"active_layer_preset": "",
|
||||||
|
"auto_track_width": false,
|
||||||
|
"hidden_nets": [],
|
||||||
|
"high_contrast_mode": 0,
|
||||||
|
"net_color_mode": 1,
|
||||||
|
"opacity": {
|
||||||
|
"pads": 1.0,
|
||||||
|
"tracks": 1.0,
|
||||||
|
"vias": 1.0,
|
||||||
|
"zones": 0.6
|
||||||
|
},
|
||||||
|
"ratsnest_display_mode": 0,
|
||||||
|
"selection_filter": {
|
||||||
|
"dimensions": true,
|
||||||
|
"footprints": true,
|
||||||
|
"graphics": true,
|
||||||
|
"keepouts": true,
|
||||||
|
"lockedItems": true,
|
||||||
|
"otherItems": true,
|
||||||
|
"pads": true,
|
||||||
|
"text": true,
|
||||||
|
"tracks": true,
|
||||||
|
"vias": true,
|
||||||
|
"zones": true
|
||||||
|
},
|
||||||
|
"visible_items": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
4,
|
||||||
|
5,
|
||||||
|
8,
|
||||||
|
9,
|
||||||
|
10,
|
||||||
|
11,
|
||||||
|
12,
|
||||||
|
13,
|
||||||
|
14,
|
||||||
|
15,
|
||||||
|
16,
|
||||||
|
17,
|
||||||
|
18,
|
||||||
|
19,
|
||||||
|
20,
|
||||||
|
21,
|
||||||
|
22,
|
||||||
|
23,
|
||||||
|
24,
|
||||||
|
25,
|
||||||
|
26,
|
||||||
|
27,
|
||||||
|
28,
|
||||||
|
29,
|
||||||
|
30,
|
||||||
|
32,
|
||||||
|
33,
|
||||||
|
34,
|
||||||
|
35,
|
||||||
|
36
|
||||||
|
],
|
||||||
|
"visible_layers": "ffcffff_ffffffff",
|
||||||
|
"zone_display_mode": 0
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"filename": "Sun_sensor.kicad_prl",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"project": {
|
||||||
|
"files": []
|
||||||
|
}
|
||||||
|
}
|
439
modules/Sun_sensor/Sun_sensor.kicad_pro
Normal file
439
modules/Sun_sensor/Sun_sensor.kicad_pro
Normal file
@ -0,0 +1,439 @@
|
|||||||
|
{
|
||||||
|
"board": {
|
||||||
|
"design_settings": {
|
||||||
|
"defaults": {
|
||||||
|
"board_outline_line_width": 0.09999999999999999,
|
||||||
|
"copper_line_width": 0.19999999999999998,
|
||||||
|
"copper_text_italic": false,
|
||||||
|
"copper_text_size_h": 1.5,
|
||||||
|
"copper_text_size_v": 1.5,
|
||||||
|
"copper_text_thickness": 0.3,
|
||||||
|
"copper_text_upright": false,
|
||||||
|
"courtyard_line_width": 0.049999999999999996,
|
||||||
|
"dimension_precision": 4,
|
||||||
|
"dimension_units": 3,
|
||||||
|
"dimensions": {
|
||||||
|
"arrow_length": 1270000,
|
||||||
|
"extension_offset": 500000,
|
||||||
|
"keep_text_aligned": true,
|
||||||
|
"suppress_zeroes": false,
|
||||||
|
"text_position": 0,
|
||||||
|
"units_format": 1
|
||||||
|
},
|
||||||
|
"fab_line_width": 0.09999999999999999,
|
||||||
|
"fab_text_italic": false,
|
||||||
|
"fab_text_size_h": 1.0,
|
||||||
|
"fab_text_size_v": 1.0,
|
||||||
|
"fab_text_thickness": 0.15,
|
||||||
|
"fab_text_upright": false,
|
||||||
|
"other_line_width": 0.15,
|
||||||
|
"other_text_italic": false,
|
||||||
|
"other_text_size_h": 1.0,
|
||||||
|
"other_text_size_v": 1.0,
|
||||||
|
"other_text_thickness": 0.15,
|
||||||
|
"other_text_upright": false,
|
||||||
|
"pads": {
|
||||||
|
"drill": 0.762,
|
||||||
|
"height": 1.524,
|
||||||
|
"width": 1.524
|
||||||
|
},
|
||||||
|
"silk_line_width": 0.15,
|
||||||
|
"silk_text_italic": false,
|
||||||
|
"silk_text_size_h": 1.0,
|
||||||
|
"silk_text_size_v": 1.0,
|
||||||
|
"silk_text_thickness": 0.15,
|
||||||
|
"silk_text_upright": false,
|
||||||
|
"zones": {
|
||||||
|
"45_degree_only": false,
|
||||||
|
"min_clearance": 0.254
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"diff_pair_dimensions": [
|
||||||
|
{
|
||||||
|
"gap": 0.0,
|
||||||
|
"via_gap": 0.0,
|
||||||
|
"width": 0.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"drc_exclusions": [],
|
||||||
|
"meta": {
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
"rule_severities": {
|
||||||
|
"annular_width": "error",
|
||||||
|
"clearance": "error",
|
||||||
|
"copper_edge_clearance": "error",
|
||||||
|
"courtyards_overlap": "error",
|
||||||
|
"diff_pair_gap_out_of_range": "error",
|
||||||
|
"diff_pair_uncoupled_length_too_long": "error",
|
||||||
|
"drill_out_of_range": "error",
|
||||||
|
"duplicate_footprints": "warning",
|
||||||
|
"extra_footprint": "warning",
|
||||||
|
"footprint_type_mismatch": "error",
|
||||||
|
"hole_clearance": "error",
|
||||||
|
"hole_near_hole": "error",
|
||||||
|
"invalid_outline": "error",
|
||||||
|
"item_on_disabled_layer": "error",
|
||||||
|
"items_not_allowed": "error",
|
||||||
|
"length_out_of_range": "error",
|
||||||
|
"malformed_courtyard": "error",
|
||||||
|
"microvia_drill_out_of_range": "error",
|
||||||
|
"missing_courtyard": "ignore",
|
||||||
|
"missing_footprint": "warning",
|
||||||
|
"net_conflict": "warning",
|
||||||
|
"npth_inside_courtyard": "ignore",
|
||||||
|
"padstack": "error",
|
||||||
|
"pth_inside_courtyard": "ignore",
|
||||||
|
"shorting_items": "error",
|
||||||
|
"silk_over_copper": "warning",
|
||||||
|
"silk_overlap": "warning",
|
||||||
|
"skew_out_of_range": "error",
|
||||||
|
"through_hole_pad_without_hole": "error",
|
||||||
|
"too_many_vias": "error",
|
||||||
|
"track_dangling": "warning",
|
||||||
|
"track_width": "error",
|
||||||
|
"tracks_crossing": "error",
|
||||||
|
"unconnected_items": "error",
|
||||||
|
"unresolved_variable": "error",
|
||||||
|
"via_dangling": "warning",
|
||||||
|
"zone_has_empty_net": "error",
|
||||||
|
"zones_intersect": "error"
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"allow_blind_buried_vias": false,
|
||||||
|
"allow_microvias": false,
|
||||||
|
"max_error": 0.005,
|
||||||
|
"min_clearance": 0.15,
|
||||||
|
"min_copper_edge_clearance": 0.19999999999999998,
|
||||||
|
"min_hole_clearance": 0.19999999999999998,
|
||||||
|
"min_hole_to_hole": 0.3,
|
||||||
|
"min_microvia_diameter": 0.19999999999999998,
|
||||||
|
"min_microvia_drill": 0.09999999999999999,
|
||||||
|
"min_silk_clearance": 0.0,
|
||||||
|
"min_through_hole_diameter": 0.19999999999999998,
|
||||||
|
"min_track_width": 0.15,
|
||||||
|
"min_via_annular_width": 0.125,
|
||||||
|
"min_via_diameter": 0.44999999999999996,
|
||||||
|
"solder_mask_clearance": 0.0,
|
||||||
|
"solder_mask_min_width": 0.0,
|
||||||
|
"use_height_for_length_calcs": true
|
||||||
|
},
|
||||||
|
"track_widths": [
|
||||||
|
0.0,
|
||||||
|
0.15,
|
||||||
|
0.25,
|
||||||
|
0.5,
|
||||||
|
1.0,
|
||||||
|
1.5,
|
||||||
|
2.0
|
||||||
|
],
|
||||||
|
"via_dimensions": [
|
||||||
|
{
|
||||||
|
"diameter": 0.0,
|
||||||
|
"drill": 0.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zones_allow_external_fillets": false,
|
||||||
|
"zones_use_no_outline": true
|
||||||
|
},
|
||||||
|
"layer_presets": []
|
||||||
|
},
|
||||||
|
"boards": [],
|
||||||
|
"cvpcb": {
|
||||||
|
"equivalence_files": []
|
||||||
|
},
|
||||||
|
"erc": {
|
||||||
|
"erc_exclusions": [],
|
||||||
|
"meta": {
|
||||||
|
"version": 0
|
||||||
|
},
|
||||||
|
"pin_map": [
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"rule_severities": {
|
||||||
|
"bus_definition_conflict": "error",
|
||||||
|
"bus_entry_needed": "error",
|
||||||
|
"bus_label_syntax": "error",
|
||||||
|
"bus_to_bus_conflict": "error",
|
||||||
|
"bus_to_net_conflict": "error",
|
||||||
|
"different_unit_footprint": "error",
|
||||||
|
"different_unit_net": "error",
|
||||||
|
"duplicate_reference": "error",
|
||||||
|
"duplicate_sheet_names": "error",
|
||||||
|
"extra_units": "error",
|
||||||
|
"global_label_dangling": "warning",
|
||||||
|
"hier_label_mismatch": "error",
|
||||||
|
"label_dangling": "error",
|
||||||
|
"lib_symbol_issues": "warning",
|
||||||
|
"multiple_net_names": "warning",
|
||||||
|
"net_not_bus_member": "warning",
|
||||||
|
"no_connect_connected": "warning",
|
||||||
|
"no_connect_dangling": "warning",
|
||||||
|
"pin_not_connected": "error",
|
||||||
|
"pin_not_driven": "error",
|
||||||
|
"pin_to_pin": "warning",
|
||||||
|
"power_pin_not_driven": "error",
|
||||||
|
"similar_labels": "warning",
|
||||||
|
"unannotated": "error",
|
||||||
|
"unit_value_mismatch": "error",
|
||||||
|
"unresolved_variable": "error",
|
||||||
|
"wire_dangling": "error"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"pinned_footprint_libs": [],
|
||||||
|
"pinned_symbol_libs": []
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"filename": "Sun_sensor.kicad_pro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"net_settings": {
|
||||||
|
"classes": [
|
||||||
|
{
|
||||||
|
"bus_width": 12.0,
|
||||||
|
"clearance": 0.15,
|
||||||
|
"diff_pair_gap": 0.25,
|
||||||
|
"diff_pair_via_gap": 0.25,
|
||||||
|
"diff_pair_width": 0.2,
|
||||||
|
"line_style": 0,
|
||||||
|
"microvia_diameter": 0.45,
|
||||||
|
"microvia_drill": 0.2,
|
||||||
|
"name": "Default",
|
||||||
|
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||||
|
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||||
|
"track_width": 0.15,
|
||||||
|
"via_diameter": 0.45,
|
||||||
|
"via_drill": 0.2,
|
||||||
|
"wire_width": 6.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
"net_colors": null
|
||||||
|
},
|
||||||
|
"pcbnew": {
|
||||||
|
"last_paths": {
|
||||||
|
"gencad": "",
|
||||||
|
"idf": "",
|
||||||
|
"netlist": "",
|
||||||
|
"specctra_dsn": "",
|
||||||
|
"step": "Sun_sensor.step",
|
||||||
|
"vrml": ""
|
||||||
|
},
|
||||||
|
"page_layout_descr_file": "/home/petr/work/butcube/resources/kicad_page_layout.kicad_wks"
|
||||||
|
},
|
||||||
|
"schematic": {
|
||||||
|
"annotate_start_num": 0,
|
||||||
|
"drawing": {
|
||||||
|
"default_line_thickness": 6.0,
|
||||||
|
"default_text_size": 50.0,
|
||||||
|
"field_names": [],
|
||||||
|
"intersheets_ref_own_page": false,
|
||||||
|
"intersheets_ref_prefix": "",
|
||||||
|
"intersheets_ref_short": false,
|
||||||
|
"intersheets_ref_show": false,
|
||||||
|
"intersheets_ref_suffix": "",
|
||||||
|
"junction_size_choice": 3,
|
||||||
|
"label_size_ratio": 0.375,
|
||||||
|
"pin_symbol_size": 25.0,
|
||||||
|
"text_offset_ratio": 0.15
|
||||||
|
},
|
||||||
|
"legacy_lib_dir": "",
|
||||||
|
"legacy_lib_list": [],
|
||||||
|
"meta": {
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"net_format_name": "",
|
||||||
|
"ngspice": {
|
||||||
|
"fix_include_paths": true,
|
||||||
|
"fix_passive_vals": false,
|
||||||
|
"meta": {
|
||||||
|
"version": 0
|
||||||
|
},
|
||||||
|
"model_mode": 0,
|
||||||
|
"workbook_filename": ""
|
||||||
|
},
|
||||||
|
"page_layout_descr_file": "/home/petr/work/butcube/resources/kicad_page_layout.kicad_wks",
|
||||||
|
"plot_directory": "",
|
||||||
|
"spice_adjust_passive_values": false,
|
||||||
|
"spice_external_command": "spice \"%I\"",
|
||||||
|
"subpart_first_id": 65,
|
||||||
|
"subpart_id_separator": 0
|
||||||
|
},
|
||||||
|
"sheets": [
|
||||||
|
[
|
||||||
|
"b4fcae78-0ce7-4618-9b55-3d67c0b38940",
|
||||||
|
""
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"text_variables": {}
|
||||||
|
}
|
5541
modules/Sun_sensor/Sun_sensor.kicad_sch
Normal file
5541
modules/Sun_sensor/Sun_sensor.kicad_sch
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,111 @@
|
|||||||
|
(footprint "Sun_shiled_stencil" (version 20211014) (generator pcbnew)
|
||||||
|
(layer "F.Cu")
|
||||||
|
(tedit 0)
|
||||||
|
(fp_text reference "REF**" (at 0 -7 unlocked) (layer "F.SilkS")
|
||||||
|
(effects (font (size 1 1) (thickness 0.15)))
|
||||||
|
(tstamp d78021b8-874f-44a3-aea0-a07c23ea80e4)
|
||||||
|
)
|
||||||
|
(fp_text value "Sun_shiled_stencil" (at 0 6.25 unlocked) (layer "F.Fab")
|
||||||
|
(effects (font (size 1 1) (thickness 0.15)))
|
||||||
|
(tstamp 97b32037-1b7d-4ef2-892d-7396cb521726)
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}" (at 0 7.75 unlocked) (layer "F.Fab")
|
||||||
|
(effects (font (size 1 1) (thickness 0.15)))
|
||||||
|
(tstamp 13a74bb0-d7b5-49ef-b400-62b8dfb89ba4)
|
||||||
|
)
|
||||||
|
(fp_line (start 6.825 -11.4) (end 6.825 -6.6) (layer "Dwgs.User") (width 0.1) (tstamp 0e956636-6ecf-40f5-b446-5a28641115e4))
|
||||||
|
(fp_line (start -19.9 -0.175) (end -15.1 -0.175) (layer "Dwgs.User") (width 0.1) (tstamp 43985166-a138-4b16-8f05-eaa329c21854))
|
||||||
|
(fp_line (start -6.825 -11.4) (end -7.175 -11.4) (layer "Dwgs.User") (width 0.1) (tstamp 562392bc-7fdc-42fb-acf8-8f876fb4baee))
|
||||||
|
(fp_line (start -23 -13) (end -23 13) (layer "Dwgs.User") (width 0.1) (tstamp 6093230f-7da9-436b-a565-22d094506fe8))
|
||||||
|
(fp_line (start 4.25 10) (end -4.25 10) (layer "Dwgs.User") (width 0.1) (tstamp 640cd49d-8be5-4b08-b630-e5f8f8377094))
|
||||||
|
(fp_line (start -21 15) (end 21 15) (layer "Dwgs.User") (width 0.1) (tstamp 6c0fac88-9a87-4a51-b33d-184c9ee1cbe4))
|
||||||
|
(fp_line (start -6.25 -0.5) (end -6.25 8) (layer "Dwgs.User") (width 0.1) (tstamp 7126884e-33f6-4742-990f-12a47d411edf))
|
||||||
|
(fp_line (start -19.9 -0.175) (end -19.9 0.175) (layer "Dwgs.User") (width 0.1) (tstamp 730eedee-9a7c-4f43-8635-69482b5c5018))
|
||||||
|
(fp_line (start -15.1 -0.175) (end -15.1 0.175) (layer "Dwgs.User") (width 0.1) (tstamp 7f8d4600-f7b7-4961-826b-537479190fec))
|
||||||
|
(fp_line (start 19.9 -0.175) (end 19.9 0.175) (layer "Dwgs.User") (width 0.1) (tstamp 809ec121-7a00-407b-9216-a6d943033b14))
|
||||||
|
(fp_line (start 7.175 -11.4) (end 6.825 -11.4) (layer "Dwgs.User") (width 0.1) (tstamp a222aa4e-c344-46b7-bf55-3c6a0aa0a374))
|
||||||
|
(fp_line (start 7.175 -6.6) (end 6.825 -6.6) (layer "Dwgs.User") (width 0.1) (tstamp a2af30a0-1af5-4580-a31f-0dd5c5ff6734))
|
||||||
|
(fp_line (start -21 -15) (end 21 -15) (layer "Dwgs.User") (width 0.1) (tstamp aa48cd2b-dfd1-49b6-83ee-da5bce84fcd5))
|
||||||
|
(fp_line (start 4.25 -2.5) (end -4.25 -2.5) (layer "Dwgs.User") (width 0.1) (tstamp aca2d6e2-fe5d-4a12-a499-e4f77b3547cc))
|
||||||
|
(fp_line (start 23 -13) (end 23 13) (layer "Dwgs.User") (width 0.1) (tstamp ae18f94e-c1fd-4c12-8c06-ff09a4e6e190))
|
||||||
|
(fp_line (start 15.1 -0.175) (end 19.9 -0.175) (layer "Dwgs.User") (width 0.1) (tstamp bea27199-2194-4f85-a1b7-c8be78ada6e8))
|
||||||
|
(fp_line (start 15.1 0.175) (end 19.9 0.175) (layer "Dwgs.User") (width 0.1) (tstamp c9dd16cc-624b-413b-a0b9-6f812f8a3f7d))
|
||||||
|
(fp_line (start 7.175 -11.4) (end 7.175 -6.6) (layer "Dwgs.User") (width 0.1) (tstamp d71880c6-495a-4f68-ae0e-ff186b05c077))
|
||||||
|
(fp_line (start 15.1 -0.175) (end 15.1 0.175) (layer "Dwgs.User") (width 0.1) (tstamp e7b98613-f8b3-4a0f-a012-c3972828c1f8))
|
||||||
|
(fp_line (start -19.9 0.175) (end -15.1 0.175) (layer "Dwgs.User") (width 0.1) (tstamp ebde6eb6-c376-45f3-8cf1-68b9dd545362))
|
||||||
|
(fp_line (start -7.175 -11.4) (end -7.175 -6.6) (layer "Dwgs.User") (width 0.1) (tstamp f8a2ccf5-c0e1-49c1-a842-399a9e338537))
|
||||||
|
(fp_line (start 6.25 -0.5) (end 6.25 8) (layer "Dwgs.User") (width 0.1) (tstamp fce5c3c5-c70c-4ae2-bcfa-1f6bf6b5df83))
|
||||||
|
(fp_line (start -6.825 -6.6) (end -7.175 -6.6) (layer "Dwgs.User") (width 0.1) (tstamp fe4338d1-8013-48f5-8247-78ece50c7ade))
|
||||||
|
(fp_line (start -6.825 -11.4) (end -6.825 -6.6) (layer "Dwgs.User") (width 0.1) (tstamp fedfbe41-eacd-4c64-8365-aaee91c517dc))
|
||||||
|
(fp_arc (start 6.25 8) (mid 5.664214 9.414214) (end 4.25 10) (layer "Dwgs.User") (width 0.1) (tstamp 02f7b83b-69e5-402a-97cd-2ab9ae004365))
|
||||||
|
(fp_arc (start -21 15) (mid -22.414214 14.414214) (end -23 13) (layer "Dwgs.User") (width 0.1) (tstamp 139f406e-f1be-4460-bd37-ea8577c4c405))
|
||||||
|
(fp_arc (start 21 -15) (mid 22.414214 -14.414214) (end 23 -13) (layer "Dwgs.User") (width 0.1) (tstamp 1f015c40-87c5-446d-9682-a71c8c78a240))
|
||||||
|
(fp_arc (start -4.25 10) (mid -5.664214 9.414214) (end -6.25 8) (layer "Dwgs.User") (width 0.1) (tstamp 40bed328-bcff-4a79-862f-05ffa9f0851e))
|
||||||
|
(fp_arc (start 4.25 -2.5) (mid 5.664214 -1.914214) (end 6.25 -0.5) (layer "Dwgs.User") (width 0.1) (tstamp 413987a6-e7ff-431f-a102-4d44d813b7bf))
|
||||||
|
(fp_arc (start -23 -13) (mid -22.414214 -14.414214) (end -21 -15) (layer "Dwgs.User") (width 0.1) (tstamp 4d123677-82ba-40d7-b06e-329a209c99e5))
|
||||||
|
(fp_arc (start -6.25 -0.5) (mid -5.664214 -1.914214) (end -4.25 -2.5) (layer "Dwgs.User") (width 0.1) (tstamp ed372a68-ac06-4910-b679-3abb459c4053))
|
||||||
|
(fp_arc (start 23 13) (mid 22.414214 14.414214) (end 21 15) (layer "Dwgs.User") (width 0.1) (tstamp f397ea00-77b3-4e52-8c1f-f40fbefb4c5a))
|
||||||
|
(fp_circle (center 19 -11) (end 20.75 -11) (layer "Dwgs.User") (width 0.1) (fill none) (tstamp 44be3ae8-2900-4186-bdf3-aa0df1b60494))
|
||||||
|
(fp_circle (center -19 -11) (end -17.25 -11) (layer "Dwgs.User") (width 0.1) (fill none) (tstamp 69d5781c-ea7a-40e7-b059-5c794936e027))
|
||||||
|
(fp_circle (center 19 11) (end 20.75 11) (layer "Dwgs.User") (width 0.1) (fill none) (tstamp e2e72bf3-dc42-417c-ad1e-89b7265ae9a4))
|
||||||
|
(fp_circle (center -19 11) (end -17.25 11) (layer "Dwgs.User") (width 0.1) (fill none) (tstamp f8dcb164-b515-4358-89d4-593010f27b67))
|
||||||
|
(fp_rect (start -7.175 -11.4) (end -6.825 -6.6) (layer "User.2") (width 0.01) (fill solid) (tstamp 15cec376-0cc5-4fb9-9546-200acbadd4c3))
|
||||||
|
(fp_rect (start 6.825 -11.4) (end 7.175 -6.6) (layer "User.2") (width 0.01) (fill solid) (tstamp 2b145196-0d0e-4b3a-a10d-f603e04431b2))
|
||||||
|
(fp_rect (start 15.1 0.175) (end 19.9 -0.175) (layer "User.2") (width 0.01) (fill solid) (tstamp 65179cb2-be1e-4398-a5c0-b1ccfeb04f75))
|
||||||
|
(fp_rect (start -4.25 -2.5) (end 4.25 10) (layer "User.2") (width 0.01) (fill solid) (tstamp 7a34eea2-a6e8-4a3b-96ce-95ae0942333a))
|
||||||
|
(fp_rect (start -19.9 0.175) (end -15.1 -0.175) (layer "User.2") (width 0.01) (fill solid) (tstamp 94f3ef5d-a92b-4037-9ba0-96a63bb9f2cf))
|
||||||
|
(fp_rect (start -6.25 -0.5) (end 6.25 8) (layer "User.2") (width 0.01) (fill solid) (tstamp 97e33b51-4c2e-434b-811f-517d98fdabf8))
|
||||||
|
(fp_circle (center 19 11) (end 20.75 11) (layer "User.2") (width 0.01) (fill solid) (tstamp 02ebc153-06e5-42e5-ae0e-95cf53d2686e))
|
||||||
|
(fp_circle (center -19 -11) (end -17.25 -11) (layer "User.2") (width 0.01) (fill solid) (tstamp 1d2e485c-13d9-491b-b9b1-d7cdb1ddacd4))
|
||||||
|
(fp_circle (center 19 -11) (end 20.75 -11) (layer "User.2") (width 0.01) (fill solid) (tstamp 4f064766-fcbe-42b2-9cf1-e3ce1c52823d))
|
||||||
|
(fp_circle (center 4.25 8) (end 6.25 8) (layer "User.2") (width 0.01) (fill solid) (tstamp b2368e7f-0f40-4282-af0f-69e4749fe499))
|
||||||
|
(fp_circle (center -19 11) (end -17.25 11) (layer "User.2") (width 0.01) (fill solid) (tstamp b4e0236b-b4d5-4fe0-a283-ecee8bcceaba))
|
||||||
|
(fp_circle (center 4.25 -0.5) (end 6.25 -0.5) (layer "User.2") (width 0.01) (fill solid) (tstamp b5fb8139-8b3b-4c94-9ad9-eb356c47c480))
|
||||||
|
(fp_circle (center -4.25 8.000001) (end -2.25 8.000001) (layer "User.2") (width 0.01) (fill solid) (tstamp c8e2cfaa-51bd-4851-a6ce-1afe5d99229f))
|
||||||
|
(fp_circle (center -4.25 -0.5) (end -2.25 -0.5) (layer "User.2") (width 0.01) (fill solid) (tstamp f2088203-ec06-4532-9ae1-2f2a4395cba9))
|
||||||
|
(group "Edges" (id 5f068654-7d13-4c99-823f-ca04be378f88)
|
||||||
|
(members
|
||||||
|
02f7b83b-69e5-402a-97cd-2ab9ae004365
|
||||||
|
0e956636-6ecf-40f5-b446-5a28641115e4
|
||||||
|
139f406e-f1be-4460-bd37-ea8577c4c405
|
||||||
|
1f015c40-87c5-446d-9682-a71c8c78a240
|
||||||
|
40bed328-bcff-4a79-862f-05ffa9f0851e
|
||||||
|
413987a6-e7ff-431f-a102-4d44d813b7bf
|
||||||
|
43985166-a138-4b16-8f05-eaa329c21854
|
||||||
|
44be3ae8-2900-4186-bdf3-aa0df1b60494
|
||||||
|
4d123677-82ba-40d7-b06e-329a209c99e5
|
||||||
|
562392bc-7fdc-42fb-acf8-8f876fb4baee
|
||||||
|
6093230f-7da9-436b-a565-22d094506fe8
|
||||||
|
640cd49d-8be5-4b08-b630-e5f8f8377094
|
||||||
|
69d5781c-ea7a-40e7-b059-5c794936e027
|
||||||
|
6c0fac88-9a87-4a51-b33d-184c9ee1cbe4
|
||||||
|
7126884e-33f6-4742-990f-12a47d411edf
|
||||||
|
730eedee-9a7c-4f43-8635-69482b5c5018
|
||||||
|
7f8d4600-f7b7-4961-826b-537479190fec
|
||||||
|
809ec121-7a00-407b-9216-a6d943033b14
|
||||||
|
a222aa4e-c344-46b7-bf55-3c6a0aa0a374
|
||||||
|
a2af30a0-1af5-4580-a31f-0dd5c5ff6734
|
||||||
|
aa48cd2b-dfd1-49b6-83ee-da5bce84fcd5
|
||||||
|
aca2d6e2-fe5d-4a12-a499-e4f77b3547cc
|
||||||
|
ae18f94e-c1fd-4c12-8c06-ff09a4e6e190
|
||||||
|
bea27199-2194-4f85-a1b7-c8be78ada6e8
|
||||||
|
c9dd16cc-624b-413b-a0b9-6f812f8a3f7d
|
||||||
|
d71880c6-495a-4f68-ae0e-ff186b05c077
|
||||||
|
e2e72bf3-dc42-417c-ad1e-89b7265ae9a4
|
||||||
|
e7b98613-f8b3-4a0f-a012-c3972828c1f8
|
||||||
|
ebde6eb6-c376-45f3-8cf1-68b9dd545362
|
||||||
|
ed372a68-ac06-4910-b679-3abb459c4053
|
||||||
|
f397ea00-77b3-4e52-8c1f-f40fbefb4c5a
|
||||||
|
f8a2ccf5-c0e1-49c1-a842-399a9e338537
|
||||||
|
f8dcb164-b515-4358-89d4-593010f27b67
|
||||||
|
fce5c3c5-c70c-4ae2-bcfa-1f6bf6b5df83
|
||||||
|
fe4338d1-8013-48f5-8247-78ece50c7ade
|
||||||
|
fedfbe41-eacd-4c64-8365-aaee91c517dc
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(model "/home/petr/work/butcube/modules/Sun_sensor/Stencil.step"
|
||||||
|
(offset (xyz 0 0 0))
|
||||||
|
(scale (xyz 1 1 1))
|
||||||
|
(rotate (xyz 0 0 0))
|
||||||
|
)
|
||||||
|
)
|
BIN
modules/Sun_sensor/doc/MLX75306.pdf
Normal file
BIN
modules/Sun_sensor/doc/MLX75306.pdf
Normal file
Binary file not shown.
86437
modules/Sun_sensor/fp-info-cache
Normal file
86437
modules/Sun_sensor/fp-info-cache
Normal file
File diff suppressed because it is too large
Load Diff
2
modules/Sun_sensor/fp-lib-table
Normal file
2
modules/Sun_sensor/fp-lib-table
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
(fp_lib_table
|
||||||
|
)
|
14
modules/Sun_sensor/fw/.mxproject
Normal file
14
modules/Sun_sensor/fw/.mxproject
Normal file
File diff suppressed because one or more lines are too long
894
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/cmsis_armcc.h
Normal file
894
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/cmsis_armcc.h
Normal file
@ -0,0 +1,894 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file cmsis_armcc.h
|
||||||
|
* @brief CMSIS compiler ARMCC (Arm Compiler 5) header file
|
||||||
|
* @version V5.1.0
|
||||||
|
* @date 08. May 2019
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2019 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CMSIS_ARMCC_H
|
||||||
|
#define __CMSIS_ARMCC_H
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677)
|
||||||
|
#error "Please use Arm Compiler Toolchain V4.0.677 or later!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* CMSIS compiler control architecture macros */
|
||||||
|
#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \
|
||||||
|
(defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) )
|
||||||
|
#define __ARM_ARCH_6M__ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1))
|
||||||
|
#define __ARM_ARCH_7M__ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1))
|
||||||
|
#define __ARM_ARCH_7EM__ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* __ARM_ARCH_8M_BASE__ not applicable */
|
||||||
|
/* __ARM_ARCH_8M_MAIN__ not applicable */
|
||||||
|
|
||||||
|
/* CMSIS compiler control DSP macros */
|
||||||
|
#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
#define __ARM_FEATURE_DSP 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* CMSIS compiler specific defines */
|
||||||
|
#ifndef __ASM
|
||||||
|
#define __ASM __asm
|
||||||
|
#endif
|
||||||
|
#ifndef __INLINE
|
||||||
|
#define __INLINE __inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_INLINE
|
||||||
|
#define __STATIC_INLINE static __inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_FORCEINLINE
|
||||||
|
#define __STATIC_FORCEINLINE static __forceinline
|
||||||
|
#endif
|
||||||
|
#ifndef __NO_RETURN
|
||||||
|
#define __NO_RETURN __declspec(noreturn)
|
||||||
|
#endif
|
||||||
|
#ifndef __USED
|
||||||
|
#define __USED __attribute__((used))
|
||||||
|
#endif
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __attribute__((weak))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED
|
||||||
|
#define __PACKED __attribute__((packed))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#define __PACKED_STRUCT __packed struct
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_UNION
|
||||||
|
#define __PACKED_UNION __packed union
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32 /* deprecated */
|
||||||
|
#define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x)))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_WRITE
|
||||||
|
#define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_READ
|
||||||
|
#define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr)))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_WRITE
|
||||||
|
#define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_READ
|
||||||
|
#define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr)))
|
||||||
|
#endif
|
||||||
|
#ifndef __ALIGNED
|
||||||
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||||
|
#endif
|
||||||
|
#ifndef __RESTRICT
|
||||||
|
#define __RESTRICT __restrict
|
||||||
|
#endif
|
||||||
|
#ifndef __COMPILER_BARRIER
|
||||||
|
#define __COMPILER_BARRIER() __memory_changed()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ######################### Startup and Lowlevel Init ######################## */
|
||||||
|
|
||||||
|
#ifndef __PROGRAM_START
|
||||||
|
#define __PROGRAM_START __main
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __INITIAL_SP
|
||||||
|
#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __STACK_LIMIT
|
||||||
|
#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __VECTOR_TABLE
|
||||||
|
#define __VECTOR_TABLE __Vectors
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __VECTOR_TABLE_ATTRIBUTE
|
||||||
|
#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET")))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ########################### Core Function Access ########################### */
|
||||||
|
/** \ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Enable IRQ Interrupts
|
||||||
|
\details Enables IRQ interrupts by clearing the I-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
/* intrinsic void __enable_irq(); */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Disable IRQ Interrupts
|
||||||
|
\details Disables IRQ interrupts by setting the I-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
/* intrinsic void __disable_irq(); */
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Control Register
|
||||||
|
\details Returns the content of the Control Register.
|
||||||
|
\return Control Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_CONTROL(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regControl __ASM("control");
|
||||||
|
return(__regControl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Control Register
|
||||||
|
\details Writes the given value to the Control Register.
|
||||||
|
\param [in] control Control Register value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_CONTROL(uint32_t control)
|
||||||
|
{
|
||||||
|
register uint32_t __regControl __ASM("control");
|
||||||
|
__regControl = control;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get IPSR Register
|
||||||
|
\details Returns the content of the IPSR Register.
|
||||||
|
\return IPSR Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_IPSR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regIPSR __ASM("ipsr");
|
||||||
|
return(__regIPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get APSR Register
|
||||||
|
\details Returns the content of the APSR Register.
|
||||||
|
\return APSR Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_APSR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regAPSR __ASM("apsr");
|
||||||
|
return(__regAPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get xPSR Register
|
||||||
|
\details Returns the content of the xPSR Register.
|
||||||
|
\return xPSR Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_xPSR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regXPSR __ASM("xpsr");
|
||||||
|
return(__regXPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Process Stack Pointer
|
||||||
|
\details Returns the current value of the Process Stack Pointer (PSP).
|
||||||
|
\return PSP Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_PSP(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regProcessStackPointer __ASM("psp");
|
||||||
|
return(__regProcessStackPointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Process Stack Pointer
|
||||||
|
\details Assigns the given value to the Process Stack Pointer (PSP).
|
||||||
|
\param [in] topOfProcStack Process Stack Pointer value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
|
||||||
|
{
|
||||||
|
register uint32_t __regProcessStackPointer __ASM("psp");
|
||||||
|
__regProcessStackPointer = topOfProcStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Main Stack Pointer
|
||||||
|
\details Returns the current value of the Main Stack Pointer (MSP).
|
||||||
|
\return MSP Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_MSP(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regMainStackPointer __ASM("msp");
|
||||||
|
return(__regMainStackPointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Main Stack Pointer
|
||||||
|
\details Assigns the given value to the Main Stack Pointer (MSP).
|
||||||
|
\param [in] topOfMainStack Main Stack Pointer value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
|
||||||
|
{
|
||||||
|
register uint32_t __regMainStackPointer __ASM("msp");
|
||||||
|
__regMainStackPointer = topOfMainStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Priority Mask
|
||||||
|
\details Returns the current state of the priority mask bit from the Priority Mask Register.
|
||||||
|
\return Priority Mask value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_PRIMASK(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regPriMask __ASM("primask");
|
||||||
|
return(__regPriMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Priority Mask
|
||||||
|
\details Assigns the given value to the Priority Mask Register.
|
||||||
|
\param [in] priMask Priority Mask
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
|
||||||
|
{
|
||||||
|
register uint32_t __regPriMask __ASM("primask");
|
||||||
|
__regPriMask = (priMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Enable FIQ
|
||||||
|
\details Enables FIQ interrupts by clearing the F-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
#define __enable_fault_irq __enable_fiq
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Disable FIQ
|
||||||
|
\details Disables FIQ interrupts by setting the F-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
#define __disable_fault_irq __disable_fiq
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Base Priority
|
||||||
|
\details Returns the current value of the Base Priority register.
|
||||||
|
\return Base Priority register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_BASEPRI(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regBasePri __ASM("basepri");
|
||||||
|
return(__regBasePri);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Base Priority
|
||||||
|
\details Assigns the given value to the Base Priority register.
|
||||||
|
\param [in] basePri Base Priority value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
|
||||||
|
{
|
||||||
|
register uint32_t __regBasePri __ASM("basepri");
|
||||||
|
__regBasePri = (basePri & 0xFFU);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Base Priority with condition
|
||||||
|
\details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,
|
||||||
|
or the new value increases the BASEPRI priority level.
|
||||||
|
\param [in] basePri Base Priority value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri)
|
||||||
|
{
|
||||||
|
register uint32_t __regBasePriMax __ASM("basepri_max");
|
||||||
|
__regBasePriMax = (basePri & 0xFFU);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Fault Mask
|
||||||
|
\details Returns the current value of the Fault Mask register.
|
||||||
|
\return Fault Mask register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_FAULTMASK(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regFaultMask __ASM("faultmask");
|
||||||
|
return(__regFaultMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Fault Mask
|
||||||
|
\details Assigns the given value to the Fault Mask register.
|
||||||
|
\param [in] faultMask Fault Mask value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
|
||||||
|
{
|
||||||
|
register uint32_t __regFaultMask __ASM("faultmask");
|
||||||
|
__regFaultMask = (faultMask & (uint32_t)1U);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get FPSCR
|
||||||
|
\details Returns the current value of the Floating Point Status/Control register.
|
||||||
|
\return Floating Point Status/Control register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_FPSCR(void)
|
||||||
|
{
|
||||||
|
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||||
|
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
|
||||||
|
register uint32_t __regfpscr __ASM("fpscr");
|
||||||
|
return(__regfpscr);
|
||||||
|
#else
|
||||||
|
return(0U);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set FPSCR
|
||||||
|
\details Assigns the given value to the Floating Point Status/Control register.
|
||||||
|
\param [in] fpscr Floating Point Status/Control value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
|
||||||
|
{
|
||||||
|
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||||
|
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
|
||||||
|
register uint32_t __regfpscr __ASM("fpscr");
|
||||||
|
__regfpscr = (fpscr);
|
||||||
|
#else
|
||||||
|
(void)fpscr;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_RegAccFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## Core Instruction Access ######################### */
|
||||||
|
/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
|
||||||
|
Access to dedicated instructions
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief No Operation
|
||||||
|
\details No Operation does nothing. This instruction can be used for code alignment purposes.
|
||||||
|
*/
|
||||||
|
#define __NOP __nop
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Wait For Interrupt
|
||||||
|
\details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.
|
||||||
|
*/
|
||||||
|
#define __WFI __wfi
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Wait For Event
|
||||||
|
\details Wait For Event is a hint instruction that permits the processor to enter
|
||||||
|
a low-power state until one of a number of events occurs.
|
||||||
|
*/
|
||||||
|
#define __WFE __wfe
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Send Event
|
||||||
|
\details Send Event is a hint instruction. It causes an event to be signaled to the CPU.
|
||||||
|
*/
|
||||||
|
#define __SEV __sev
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Instruction Synchronization Barrier
|
||||||
|
\details Instruction Synchronization Barrier flushes the pipeline in the processor,
|
||||||
|
so that all instructions following the ISB are fetched from cache or memory,
|
||||||
|
after the instruction has been completed.
|
||||||
|
*/
|
||||||
|
#define __ISB() do {\
|
||||||
|
__schedule_barrier();\
|
||||||
|
__isb(0xF);\
|
||||||
|
__schedule_barrier();\
|
||||||
|
} while (0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Data Synchronization Barrier
|
||||||
|
\details Acts as a special kind of Data Memory Barrier.
|
||||||
|
It completes when all explicit memory accesses before this instruction complete.
|
||||||
|
*/
|
||||||
|
#define __DSB() do {\
|
||||||
|
__schedule_barrier();\
|
||||||
|
__dsb(0xF);\
|
||||||
|
__schedule_barrier();\
|
||||||
|
} while (0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Data Memory Barrier
|
||||||
|
\details Ensures the apparent order of the explicit memory operations before
|
||||||
|
and after the instruction, without ensuring their completion.
|
||||||
|
*/
|
||||||
|
#define __DMB() do {\
|
||||||
|
__schedule_barrier();\
|
||||||
|
__dmb(0xF);\
|
||||||
|
__schedule_barrier();\
|
||||||
|
} while (0U)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Reverse byte order (32 bit)
|
||||||
|
\details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
#define __REV __rev
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Reverse byte order (16 bit)
|
||||||
|
\details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
#ifndef __NO_EMBEDDED_ASM
|
||||||
|
__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
|
||||||
|
{
|
||||||
|
rev16 r0, r0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Reverse byte order (16 bit)
|
||||||
|
\details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
#ifndef __NO_EMBEDDED_ASM
|
||||||
|
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value)
|
||||||
|
{
|
||||||
|
revsh r0, r0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Rotate Right in unsigned value (32 bit)
|
||||||
|
\details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
|
||||||
|
\param [in] op1 Value to rotate
|
||||||
|
\param [in] op2 Number of Bits to rotate
|
||||||
|
\return Rotated value
|
||||||
|
*/
|
||||||
|
#define __ROR __ror
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Breakpoint
|
||||||
|
\details Causes the processor to enter Debug state.
|
||||||
|
Debug tools can use this to investigate system state when the instruction at a particular address is reached.
|
||||||
|
\param [in] value is ignored by the processor.
|
||||||
|
If required, a debugger can use it to store additional information about the breakpoint.
|
||||||
|
*/
|
||||||
|
#define __BKPT(value) __breakpoint(value)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Reverse bit order of value
|
||||||
|
\details Reverses the bit order of the given value.
|
||||||
|
\param [in] value Value to reverse
|
||||||
|
\return Reversed value
|
||||||
|
*/
|
||||||
|
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
#define __RBIT __rbit
|
||||||
|
#else
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */
|
||||||
|
|
||||||
|
result = value; /* r will be reversed bits of v; first get LSB of v */
|
||||||
|
for (value >>= 1U; value != 0U; value >>= 1U)
|
||||||
|
{
|
||||||
|
result <<= 1U;
|
||||||
|
result |= value & 1U;
|
||||||
|
s--;
|
||||||
|
}
|
||||||
|
result <<= s; /* shift when v's highest bits are zero */
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Count leading zeros
|
||||||
|
\details Counts the number of leading zeros of a data value.
|
||||||
|
\param [in] value Value to count the leading zeros
|
||||||
|
\return number of leading zeros in value
|
||||||
|
*/
|
||||||
|
#define __CLZ __clz
|
||||||
|
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief LDR Exclusive (8 bit)
|
||||||
|
\details Executes a exclusive LDR instruction for 8 bit value.
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint8_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
|
||||||
|
#else
|
||||||
|
#define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief LDR Exclusive (16 bit)
|
||||||
|
\details Executes a exclusive LDR instruction for 16 bit values.
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint16_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
|
||||||
|
#else
|
||||||
|
#define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief LDR Exclusive (32 bit)
|
||||||
|
\details Executes a exclusive LDR instruction for 32 bit values.
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint32_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
|
||||||
|
#else
|
||||||
|
#define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief STR Exclusive (8 bit)
|
||||||
|
\details Executes a exclusive STR instruction for 8 bit values.
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
\return 0 Function succeeded
|
||||||
|
\return 1 Function failed
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __STREXB(value, ptr) __strex(value, ptr)
|
||||||
|
#else
|
||||||
|
#define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief STR Exclusive (16 bit)
|
||||||
|
\details Executes a exclusive STR instruction for 16 bit values.
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
\return 0 Function succeeded
|
||||||
|
\return 1 Function failed
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __STREXH(value, ptr) __strex(value, ptr)
|
||||||
|
#else
|
||||||
|
#define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief STR Exclusive (32 bit)
|
||||||
|
\details Executes a exclusive STR instruction for 32 bit values.
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
\return 0 Function succeeded
|
||||||
|
\return 1 Function failed
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __STREXW(value, ptr) __strex(value, ptr)
|
||||||
|
#else
|
||||||
|
#define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Remove the exclusive lock
|
||||||
|
\details Removes the exclusive lock which is created by LDREX.
|
||||||
|
*/
|
||||||
|
#define __CLREX __clrex
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Signed Saturate
|
||||||
|
\details Saturates a signed value.
|
||||||
|
\param [in] value Value to be saturated
|
||||||
|
\param [in] sat Bit position to saturate to (1..32)
|
||||||
|
\return Saturated value
|
||||||
|
*/
|
||||||
|
#define __SSAT __ssat
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Unsigned Saturate
|
||||||
|
\details Saturates an unsigned value.
|
||||||
|
\param [in] value Value to be saturated
|
||||||
|
\param [in] sat Bit position to saturate to (0..31)
|
||||||
|
\return Saturated value
|
||||||
|
*/
|
||||||
|
#define __USAT __usat
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Rotate Right with Extend (32 bit)
|
||||||
|
\details Moves each bit of a bitstring right by one bit.
|
||||||
|
The carry input is shifted in at the left end of the bitstring.
|
||||||
|
\param [in] value Value to rotate
|
||||||
|
\return Rotated value
|
||||||
|
*/
|
||||||
|
#ifndef __NO_EMBEDDED_ASM
|
||||||
|
__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
|
||||||
|
{
|
||||||
|
rrx r0, r0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief LDRT Unprivileged (8 bit)
|
||||||
|
\details Executes a Unprivileged LDRT instruction for 8 bit value.
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint8_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief LDRT Unprivileged (16 bit)
|
||||||
|
\details Executes a Unprivileged LDRT instruction for 16 bit values.
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint16_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief LDRT Unprivileged (32 bit)
|
||||||
|
\details Executes a Unprivileged LDRT instruction for 32 bit values.
|
||||||
|
\param [in] ptr Pointer to data
|
||||||
|
\return value of type uint32_t at (*ptr)
|
||||||
|
*/
|
||||||
|
#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief STRT Unprivileged (8 bit)
|
||||||
|
\details Executes a Unprivileged STRT instruction for 8 bit values.
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
*/
|
||||||
|
#define __STRBT(value, ptr) __strt(value, ptr)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief STRT Unprivileged (16 bit)
|
||||||
|
\details Executes a Unprivileged STRT instruction for 16 bit values.
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
*/
|
||||||
|
#define __STRHT(value, ptr) __strt(value, ptr)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief STRT Unprivileged (32 bit)
|
||||||
|
\details Executes a Unprivileged STRT instruction for 32 bit values.
|
||||||
|
\param [in] value Value to store
|
||||||
|
\param [in] ptr Pointer to location
|
||||||
|
*/
|
||||||
|
#define __STRT(value, ptr) __strt(value, ptr)
|
||||||
|
|
||||||
|
#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Signed Saturate
|
||||||
|
\details Saturates a signed value.
|
||||||
|
\param [in] value Value to be saturated
|
||||||
|
\param [in] sat Bit position to saturate to (1..32)
|
||||||
|
\return Saturated value
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat)
|
||||||
|
{
|
||||||
|
if ((sat >= 1U) && (sat <= 32U))
|
||||||
|
{
|
||||||
|
const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
|
||||||
|
const int32_t min = -1 - max ;
|
||||||
|
if (val > max)
|
||||||
|
{
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
else if (val < min)
|
||||||
|
{
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Unsigned Saturate
|
||||||
|
\details Saturates an unsigned value.
|
||||||
|
\param [in] value Value to be saturated
|
||||||
|
\param [in] sat Bit position to saturate to (0..31)
|
||||||
|
\return Saturated value
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat)
|
||||||
|
{
|
||||||
|
if (sat <= 31U)
|
||||||
|
{
|
||||||
|
const uint32_t max = ((1U << sat) - 1U);
|
||||||
|
if (val > (int32_t)max)
|
||||||
|
{
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
else if (val < 0)
|
||||||
|
{
|
||||||
|
return 0U;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (uint32_t)val;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
|
||||||
|
|
||||||
|
/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
|
||||||
|
|
||||||
|
|
||||||
|
/* ################### Compiler specific Intrinsics ########################### */
|
||||||
|
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
|
||||||
|
Access to dedicated SIMD instructions
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
|
||||||
|
#define __SADD8 __sadd8
|
||||||
|
#define __QADD8 __qadd8
|
||||||
|
#define __SHADD8 __shadd8
|
||||||
|
#define __UADD8 __uadd8
|
||||||
|
#define __UQADD8 __uqadd8
|
||||||
|
#define __UHADD8 __uhadd8
|
||||||
|
#define __SSUB8 __ssub8
|
||||||
|
#define __QSUB8 __qsub8
|
||||||
|
#define __SHSUB8 __shsub8
|
||||||
|
#define __USUB8 __usub8
|
||||||
|
#define __UQSUB8 __uqsub8
|
||||||
|
#define __UHSUB8 __uhsub8
|
||||||
|
#define __SADD16 __sadd16
|
||||||
|
#define __QADD16 __qadd16
|
||||||
|
#define __SHADD16 __shadd16
|
||||||
|
#define __UADD16 __uadd16
|
||||||
|
#define __UQADD16 __uqadd16
|
||||||
|
#define __UHADD16 __uhadd16
|
||||||
|
#define __SSUB16 __ssub16
|
||||||
|
#define __QSUB16 __qsub16
|
||||||
|
#define __SHSUB16 __shsub16
|
||||||
|
#define __USUB16 __usub16
|
||||||
|
#define __UQSUB16 __uqsub16
|
||||||
|
#define __UHSUB16 __uhsub16
|
||||||
|
#define __SASX __sasx
|
||||||
|
#define __QASX __qasx
|
||||||
|
#define __SHASX __shasx
|
||||||
|
#define __UASX __uasx
|
||||||
|
#define __UQASX __uqasx
|
||||||
|
#define __UHASX __uhasx
|
||||||
|
#define __SSAX __ssax
|
||||||
|
#define __QSAX __qsax
|
||||||
|
#define __SHSAX __shsax
|
||||||
|
#define __USAX __usax
|
||||||
|
#define __UQSAX __uqsax
|
||||||
|
#define __UHSAX __uhsax
|
||||||
|
#define __USAD8 __usad8
|
||||||
|
#define __USADA8 __usada8
|
||||||
|
#define __SSAT16 __ssat16
|
||||||
|
#define __USAT16 __usat16
|
||||||
|
#define __UXTB16 __uxtb16
|
||||||
|
#define __UXTAB16 __uxtab16
|
||||||
|
#define __SXTB16 __sxtb16
|
||||||
|
#define __SXTAB16 __sxtab16
|
||||||
|
#define __SMUAD __smuad
|
||||||
|
#define __SMUADX __smuadx
|
||||||
|
#define __SMLAD __smlad
|
||||||
|
#define __SMLADX __smladx
|
||||||
|
#define __SMLALD __smlald
|
||||||
|
#define __SMLALDX __smlaldx
|
||||||
|
#define __SMUSD __smusd
|
||||||
|
#define __SMUSDX __smusdx
|
||||||
|
#define __SMLSD __smlsd
|
||||||
|
#define __SMLSDX __smlsdx
|
||||||
|
#define __SMLSLD __smlsld
|
||||||
|
#define __SMLSLDX __smlsldx
|
||||||
|
#define __SEL __sel
|
||||||
|
#define __QADD __qadd
|
||||||
|
#define __QSUB __qsub
|
||||||
|
|
||||||
|
#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \
|
||||||
|
((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) )
|
||||||
|
|
||||||
|
#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
|
||||||
|
((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
|
||||||
|
|
||||||
|
#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \
|
||||||
|
((int64_t)(ARG3) << 32U) ) >> 32U))
|
||||||
|
|
||||||
|
#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
|
||||||
|
/*@} end of group CMSIS_SIMD_intrinsics */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __CMSIS_ARMCC_H */
|
1444
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/cmsis_armclang.h
Normal file
1444
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/cmsis_armclang.h
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,283 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file cmsis_compiler.h
|
||||||
|
* @brief CMSIS compiler generic header file
|
||||||
|
* @version V5.1.0
|
||||||
|
* @date 09. October 2018
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2018 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CMSIS_COMPILER_H
|
||||||
|
#define __CMSIS_COMPILER_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Arm Compiler 4/5
|
||||||
|
*/
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#include "cmsis_armcc.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Arm Compiler 6.6 LTM (armclang)
|
||||||
|
*/
|
||||||
|
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100)
|
||||||
|
#include "cmsis_armclang_ltm.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Arm Compiler above 6.10.1 (armclang)
|
||||||
|
*/
|
||||||
|
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100)
|
||||||
|
#include "cmsis_armclang.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GNU Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#include "cmsis_gcc.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IAR Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#include <cmsis_iccarm.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TI Arm Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __TI_ARM__ )
|
||||||
|
#include <cmsis_ccs.h>
|
||||||
|
|
||||||
|
#ifndef __ASM
|
||||||
|
#define __ASM __asm
|
||||||
|
#endif
|
||||||
|
#ifndef __INLINE
|
||||||
|
#define __INLINE inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_INLINE
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_FORCEINLINE
|
||||||
|
#define __STATIC_FORCEINLINE __STATIC_INLINE
|
||||||
|
#endif
|
||||||
|
#ifndef __NO_RETURN
|
||||||
|
#define __NO_RETURN __attribute__((noreturn))
|
||||||
|
#endif
|
||||||
|
#ifndef __USED
|
||||||
|
#define __USED __attribute__((used))
|
||||||
|
#endif
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __attribute__((weak))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED
|
||||||
|
#define __PACKED __attribute__((packed))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#define __PACKED_STRUCT struct __attribute__((packed))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_UNION
|
||||||
|
#define __PACKED_UNION union __attribute__((packed))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32 /* deprecated */
|
||||||
|
struct __attribute__((packed)) T_UINT32 { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_WRITE
|
||||||
|
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
|
||||||
|
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_READ
|
||||||
|
__PACKED_STRUCT T_UINT16_READ { uint16_t v; };
|
||||||
|
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_WRITE
|
||||||
|
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_READ
|
||||||
|
__PACKED_STRUCT T_UINT32_READ { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __ALIGNED
|
||||||
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||||
|
#endif
|
||||||
|
#ifndef __RESTRICT
|
||||||
|
#define __RESTRICT __restrict
|
||||||
|
#endif
|
||||||
|
#ifndef __COMPILER_BARRIER
|
||||||
|
#warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored.
|
||||||
|
#define __COMPILER_BARRIER() (void)0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TASKING Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
/*
|
||||||
|
* The CMSIS functions have been implemented as intrinsics in the compiler.
|
||||||
|
* Please use "carm -?i" to get an up to date list of all intrinsics,
|
||||||
|
* Including the CMSIS ones.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ASM
|
||||||
|
#define __ASM __asm
|
||||||
|
#endif
|
||||||
|
#ifndef __INLINE
|
||||||
|
#define __INLINE inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_INLINE
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_FORCEINLINE
|
||||||
|
#define __STATIC_FORCEINLINE __STATIC_INLINE
|
||||||
|
#endif
|
||||||
|
#ifndef __NO_RETURN
|
||||||
|
#define __NO_RETURN __attribute__((noreturn))
|
||||||
|
#endif
|
||||||
|
#ifndef __USED
|
||||||
|
#define __USED __attribute__((used))
|
||||||
|
#endif
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __attribute__((weak))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED
|
||||||
|
#define __PACKED __packed__
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#define __PACKED_STRUCT struct __packed__
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_UNION
|
||||||
|
#define __PACKED_UNION union __packed__
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32 /* deprecated */
|
||||||
|
struct __packed__ T_UINT32 { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_WRITE
|
||||||
|
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
|
||||||
|
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_READ
|
||||||
|
__PACKED_STRUCT T_UINT16_READ { uint16_t v; };
|
||||||
|
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_WRITE
|
||||||
|
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_READ
|
||||||
|
__PACKED_STRUCT T_UINT32_READ { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __ALIGNED
|
||||||
|
#define __ALIGNED(x) __align(x)
|
||||||
|
#endif
|
||||||
|
#ifndef __RESTRICT
|
||||||
|
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
|
||||||
|
#define __RESTRICT
|
||||||
|
#endif
|
||||||
|
#ifndef __COMPILER_BARRIER
|
||||||
|
#warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored.
|
||||||
|
#define __COMPILER_BARRIER() (void)0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COSMIC Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __CSMC__ )
|
||||||
|
#include <cmsis_csm.h>
|
||||||
|
|
||||||
|
#ifndef __ASM
|
||||||
|
#define __ASM _asm
|
||||||
|
#endif
|
||||||
|
#ifndef __INLINE
|
||||||
|
#define __INLINE inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_INLINE
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
#endif
|
||||||
|
#ifndef __STATIC_FORCEINLINE
|
||||||
|
#define __STATIC_FORCEINLINE __STATIC_INLINE
|
||||||
|
#endif
|
||||||
|
#ifndef __NO_RETURN
|
||||||
|
// NO RETURN is automatically detected hence no warning here
|
||||||
|
#define __NO_RETURN
|
||||||
|
#endif
|
||||||
|
#ifndef __USED
|
||||||
|
#warning No compiler specific solution for __USED. __USED is ignored.
|
||||||
|
#define __USED
|
||||||
|
#endif
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __weak
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED
|
||||||
|
#define __PACKED @packed
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#define __PACKED_STRUCT @packed struct
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_UNION
|
||||||
|
#define __PACKED_UNION @packed union
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32 /* deprecated */
|
||||||
|
@packed struct T_UINT32 { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_WRITE
|
||||||
|
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
|
||||||
|
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_READ
|
||||||
|
__PACKED_STRUCT T_UINT16_READ { uint16_t v; };
|
||||||
|
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_WRITE
|
||||||
|
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_READ
|
||||||
|
__PACKED_STRUCT T_UINT32_READ { uint32_t v; };
|
||||||
|
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
|
||||||
|
#endif
|
||||||
|
#ifndef __ALIGNED
|
||||||
|
#warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored.
|
||||||
|
#define __ALIGNED(x)
|
||||||
|
#endif
|
||||||
|
#ifndef __RESTRICT
|
||||||
|
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
|
||||||
|
#define __RESTRICT
|
||||||
|
#endif
|
||||||
|
#ifndef __COMPILER_BARRIER
|
||||||
|
#warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored.
|
||||||
|
#define __COMPILER_BARRIER() (void)0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error Unknown compiler.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __CMSIS_COMPILER_H */
|
||||||
|
|
2168
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/cmsis_gcc.h
Normal file
2168
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/cmsis_gcc.h
Normal file
File diff suppressed because it is too large
Load Diff
964
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/cmsis_iccarm.h
Normal file
964
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/cmsis_iccarm.h
Normal file
@ -0,0 +1,964 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file cmsis_iccarm.h
|
||||||
|
* @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file
|
||||||
|
* @version V5.1.0
|
||||||
|
* @date 08. May 2019
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Copyright (c) 2017-2019 IAR Systems
|
||||||
|
// Copyright (c) 2017-2019 Arm Limited. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License")
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __CMSIS_ICCARM_H__
|
||||||
|
#define __CMSIS_ICCARM_H__
|
||||||
|
|
||||||
|
#ifndef __ICCARM__
|
||||||
|
#error This file should only be compiled by ICCARM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#pragma system_include
|
||||||
|
|
||||||
|
#define __IAR_FT _Pragma("inline=forced") __intrinsic
|
||||||
|
|
||||||
|
#if (__VER__ >= 8000000)
|
||||||
|
#define __ICCARM_V8 1
|
||||||
|
#else
|
||||||
|
#define __ICCARM_V8 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ALIGNED
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||||
|
#elif (__VER__ >= 7080000)
|
||||||
|
/* Needs IAR language extensions */
|
||||||
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||||
|
#else
|
||||||
|
#warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored.
|
||||||
|
#define __ALIGNED(x)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Define compiler macros for CPU architecture, used in CMSIS 5.
|
||||||
|
*/
|
||||||
|
#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__
|
||||||
|
/* Macros already defined */
|
||||||
|
#else
|
||||||
|
#if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__)
|
||||||
|
#define __ARM_ARCH_8M_MAIN__ 1
|
||||||
|
#elif defined(__ARM8M_BASELINE__)
|
||||||
|
#define __ARM_ARCH_8M_BASE__ 1
|
||||||
|
#elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M'
|
||||||
|
#if __ARM_ARCH == 6
|
||||||
|
#define __ARM_ARCH_6M__ 1
|
||||||
|
#elif __ARM_ARCH == 7
|
||||||
|
#if __ARM_FEATURE_DSP
|
||||||
|
#define __ARM_ARCH_7EM__ 1
|
||||||
|
#else
|
||||||
|
#define __ARM_ARCH_7M__ 1
|
||||||
|
#endif
|
||||||
|
#endif /* __ARM_ARCH */
|
||||||
|
#endif /* __ARM_ARCH_PROFILE == 'M' */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Alternativ core deduction for older ICCARM's */
|
||||||
|
#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \
|
||||||
|
!defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__)
|
||||||
|
#if defined(__ARM6M__) && (__CORE__ == __ARM6M__)
|
||||||
|
#define __ARM_ARCH_6M__ 1
|
||||||
|
#elif defined(__ARM7M__) && (__CORE__ == __ARM7M__)
|
||||||
|
#define __ARM_ARCH_7M__ 1
|
||||||
|
#elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__)
|
||||||
|
#define __ARM_ARCH_7EM__ 1
|
||||||
|
#elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__)
|
||||||
|
#define __ARM_ARCH_8M_BASE__ 1
|
||||||
|
#elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__)
|
||||||
|
#define __ARM_ARCH_8M_MAIN__ 1
|
||||||
|
#elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__)
|
||||||
|
#define __ARM_ARCH_8M_MAIN__ 1
|
||||||
|
#else
|
||||||
|
#error "Unknown target."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1
|
||||||
|
#define __IAR_M0_FAMILY 1
|
||||||
|
#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1
|
||||||
|
#define __IAR_M0_FAMILY 1
|
||||||
|
#else
|
||||||
|
#define __IAR_M0_FAMILY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __ASM
|
||||||
|
#define __ASM __asm
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __COMPILER_BARRIER
|
||||||
|
#define __COMPILER_BARRIER() __ASM volatile("":::"memory")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __INLINE
|
||||||
|
#define __INLINE inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __NO_RETURN
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __NO_RETURN __attribute__((__noreturn__))
|
||||||
|
#else
|
||||||
|
#define __NO_RETURN _Pragma("object_attribute=__noreturn")
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __PACKED
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __PACKED __attribute__((packed, aligned(1)))
|
||||||
|
#else
|
||||||
|
/* Needs IAR language extensions */
|
||||||
|
#define __PACKED __packed
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
|
||||||
|
#else
|
||||||
|
/* Needs IAR language extensions */
|
||||||
|
#define __PACKED_STRUCT __packed struct
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __PACKED_UNION
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __PACKED_UNION union __attribute__((packed, aligned(1)))
|
||||||
|
#else
|
||||||
|
/* Needs IAR language extensions */
|
||||||
|
#define __PACKED_UNION __packed union
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __RESTRICT
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __RESTRICT __restrict
|
||||||
|
#else
|
||||||
|
/* Needs IAR language extensions */
|
||||||
|
#define __RESTRICT restrict
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __STATIC_INLINE
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __FORCEINLINE
|
||||||
|
#define __FORCEINLINE _Pragma("inline=forced")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __STATIC_FORCEINLINE
|
||||||
|
#define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __UNALIGNED_UINT16_READ
|
||||||
|
#pragma language=save
|
||||||
|
#pragma language=extended
|
||||||
|
__IAR_FT uint16_t __iar_uint16_read(void const *ptr)
|
||||||
|
{
|
||||||
|
return *(__packed uint16_t*)(ptr);
|
||||||
|
}
|
||||||
|
#pragma language=restore
|
||||||
|
#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __UNALIGNED_UINT16_WRITE
|
||||||
|
#pragma language=save
|
||||||
|
#pragma language=extended
|
||||||
|
__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val)
|
||||||
|
{
|
||||||
|
*(__packed uint16_t*)(ptr) = val;;
|
||||||
|
}
|
||||||
|
#pragma language=restore
|
||||||
|
#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __UNALIGNED_UINT32_READ
|
||||||
|
#pragma language=save
|
||||||
|
#pragma language=extended
|
||||||
|
__IAR_FT uint32_t __iar_uint32_read(void const *ptr)
|
||||||
|
{
|
||||||
|
return *(__packed uint32_t*)(ptr);
|
||||||
|
}
|
||||||
|
#pragma language=restore
|
||||||
|
#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __UNALIGNED_UINT32_WRITE
|
||||||
|
#pragma language=save
|
||||||
|
#pragma language=extended
|
||||||
|
__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val)
|
||||||
|
{
|
||||||
|
*(__packed uint32_t*)(ptr) = val;;
|
||||||
|
}
|
||||||
|
#pragma language=restore
|
||||||
|
#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __UNALIGNED_UINT32 /* deprecated */
|
||||||
|
#pragma language=save
|
||||||
|
#pragma language=extended
|
||||||
|
__packed struct __iar_u32 { uint32_t v; };
|
||||||
|
#pragma language=restore
|
||||||
|
#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __USED
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __USED __attribute__((used))
|
||||||
|
#else
|
||||||
|
#define __USED _Pragma("__root")
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __WEAK
|
||||||
|
#if __ICCARM_V8
|
||||||
|
#define __WEAK __attribute__((weak))
|
||||||
|
#else
|
||||||
|
#define __WEAK _Pragma("__weak")
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __PROGRAM_START
|
||||||
|
#define __PROGRAM_START __iar_program_start
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __INITIAL_SP
|
||||||
|
#define __INITIAL_SP CSTACK$$Limit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __STACK_LIMIT
|
||||||
|
#define __STACK_LIMIT CSTACK$$Base
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __VECTOR_TABLE
|
||||||
|
#define __VECTOR_TABLE __vector_table
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __VECTOR_TABLE_ATTRIBUTE
|
||||||
|
#define __VECTOR_TABLE_ATTRIBUTE @".intvec"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ICCARM_INTRINSICS_VERSION__
|
||||||
|
#define __ICCARM_INTRINSICS_VERSION__ 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __ICCARM_INTRINSICS_VERSION__ == 2
|
||||||
|
|
||||||
|
#if defined(__CLZ)
|
||||||
|
#undef __CLZ
|
||||||
|
#endif
|
||||||
|
#if defined(__REVSH)
|
||||||
|
#undef __REVSH
|
||||||
|
#endif
|
||||||
|
#if defined(__RBIT)
|
||||||
|
#undef __RBIT
|
||||||
|
#endif
|
||||||
|
#if defined(__SSAT)
|
||||||
|
#undef __SSAT
|
||||||
|
#endif
|
||||||
|
#if defined(__USAT)
|
||||||
|
#undef __USAT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "iccarm_builtin.h"
|
||||||
|
|
||||||
|
#define __disable_fault_irq __iar_builtin_disable_fiq
|
||||||
|
#define __disable_irq __iar_builtin_disable_interrupt
|
||||||
|
#define __enable_fault_irq __iar_builtin_enable_fiq
|
||||||
|
#define __enable_irq __iar_builtin_enable_interrupt
|
||||||
|
#define __arm_rsr __iar_builtin_rsr
|
||||||
|
#define __arm_wsr __iar_builtin_wsr
|
||||||
|
|
||||||
|
|
||||||
|
#define __get_APSR() (__arm_rsr("APSR"))
|
||||||
|
#define __get_BASEPRI() (__arm_rsr("BASEPRI"))
|
||||||
|
#define __get_CONTROL() (__arm_rsr("CONTROL"))
|
||||||
|
#define __get_FAULTMASK() (__arm_rsr("FAULTMASK"))
|
||||||
|
|
||||||
|
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||||
|
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
|
||||||
|
#define __get_FPSCR() (__arm_rsr("FPSCR"))
|
||||||
|
#define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE)))
|
||||||
|
#else
|
||||||
|
#define __get_FPSCR() ( 0 )
|
||||||
|
#define __set_FPSCR(VALUE) ((void)VALUE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __get_IPSR() (__arm_rsr("IPSR"))
|
||||||
|
#define __get_MSP() (__arm_rsr("MSP"))
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure MSPLIM is RAZ/WI
|
||||||
|
#define __get_MSPLIM() (0U)
|
||||||
|
#else
|
||||||
|
#define __get_MSPLIM() (__arm_rsr("MSPLIM"))
|
||||||
|
#endif
|
||||||
|
#define __get_PRIMASK() (__arm_rsr("PRIMASK"))
|
||||||
|
#define __get_PSP() (__arm_rsr("PSP"))
|
||||||
|
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
#define __get_PSPLIM() (0U)
|
||||||
|
#else
|
||||||
|
#define __get_PSPLIM() (__arm_rsr("PSPLIM"))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __get_xPSR() (__arm_rsr("xPSR"))
|
||||||
|
|
||||||
|
#define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE)))
|
||||||
|
#define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE)))
|
||||||
|
#define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE)))
|
||||||
|
#define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE)))
|
||||||
|
#define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE)))
|
||||||
|
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure MSPLIM is RAZ/WI
|
||||||
|
#define __set_MSPLIM(VALUE) ((void)(VALUE))
|
||||||
|
#else
|
||||||
|
#define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE)))
|
||||||
|
#endif
|
||||||
|
#define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE)))
|
||||||
|
#define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE)))
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
#define __set_PSPLIM(VALUE) ((void)(VALUE))
|
||||||
|
#else
|
||||||
|
#define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS"))
|
||||||
|
#define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE)))
|
||||||
|
#define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS"))
|
||||||
|
#define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE)))
|
||||||
|
#define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS"))
|
||||||
|
#define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE)))
|
||||||
|
#define __TZ_get_SP_NS() (__arm_rsr("SP_NS"))
|
||||||
|
#define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE)))
|
||||||
|
#define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS"))
|
||||||
|
#define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE)))
|
||||||
|
#define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS"))
|
||||||
|
#define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE)))
|
||||||
|
#define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS"))
|
||||||
|
#define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE)))
|
||||||
|
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
#define __TZ_get_PSPLIM_NS() (0U)
|
||||||
|
#define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE))
|
||||||
|
#else
|
||||||
|
#define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS"))
|
||||||
|
#define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS"))
|
||||||
|
#define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE)))
|
||||||
|
|
||||||
|
#define __NOP __iar_builtin_no_operation
|
||||||
|
|
||||||
|
#define __CLZ __iar_builtin_CLZ
|
||||||
|
#define __CLREX __iar_builtin_CLREX
|
||||||
|
|
||||||
|
#define __DMB __iar_builtin_DMB
|
||||||
|
#define __DSB __iar_builtin_DSB
|
||||||
|
#define __ISB __iar_builtin_ISB
|
||||||
|
|
||||||
|
#define __LDREXB __iar_builtin_LDREXB
|
||||||
|
#define __LDREXH __iar_builtin_LDREXH
|
||||||
|
#define __LDREXW __iar_builtin_LDREX
|
||||||
|
|
||||||
|
#define __RBIT __iar_builtin_RBIT
|
||||||
|
#define __REV __iar_builtin_REV
|
||||||
|
#define __REV16 __iar_builtin_REV16
|
||||||
|
|
||||||
|
__IAR_FT int16_t __REVSH(int16_t val)
|
||||||
|
{
|
||||||
|
return (int16_t) __iar_builtin_REVSH(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define __ROR __iar_builtin_ROR
|
||||||
|
#define __RRX __iar_builtin_RRX
|
||||||
|
|
||||||
|
#define __SEV __iar_builtin_SEV
|
||||||
|
|
||||||
|
#if !__IAR_M0_FAMILY
|
||||||
|
#define __SSAT __iar_builtin_SSAT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __STREXB __iar_builtin_STREXB
|
||||||
|
#define __STREXH __iar_builtin_STREXH
|
||||||
|
#define __STREXW __iar_builtin_STREX
|
||||||
|
|
||||||
|
#if !__IAR_M0_FAMILY
|
||||||
|
#define __USAT __iar_builtin_USAT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __WFE __iar_builtin_WFE
|
||||||
|
#define __WFI __iar_builtin_WFI
|
||||||
|
|
||||||
|
#if __ARM_MEDIA__
|
||||||
|
#define __SADD8 __iar_builtin_SADD8
|
||||||
|
#define __QADD8 __iar_builtin_QADD8
|
||||||
|
#define __SHADD8 __iar_builtin_SHADD8
|
||||||
|
#define __UADD8 __iar_builtin_UADD8
|
||||||
|
#define __UQADD8 __iar_builtin_UQADD8
|
||||||
|
#define __UHADD8 __iar_builtin_UHADD8
|
||||||
|
#define __SSUB8 __iar_builtin_SSUB8
|
||||||
|
#define __QSUB8 __iar_builtin_QSUB8
|
||||||
|
#define __SHSUB8 __iar_builtin_SHSUB8
|
||||||
|
#define __USUB8 __iar_builtin_USUB8
|
||||||
|
#define __UQSUB8 __iar_builtin_UQSUB8
|
||||||
|
#define __UHSUB8 __iar_builtin_UHSUB8
|
||||||
|
#define __SADD16 __iar_builtin_SADD16
|
||||||
|
#define __QADD16 __iar_builtin_QADD16
|
||||||
|
#define __SHADD16 __iar_builtin_SHADD16
|
||||||
|
#define __UADD16 __iar_builtin_UADD16
|
||||||
|
#define __UQADD16 __iar_builtin_UQADD16
|
||||||
|
#define __UHADD16 __iar_builtin_UHADD16
|
||||||
|
#define __SSUB16 __iar_builtin_SSUB16
|
||||||
|
#define __QSUB16 __iar_builtin_QSUB16
|
||||||
|
#define __SHSUB16 __iar_builtin_SHSUB16
|
||||||
|
#define __USUB16 __iar_builtin_USUB16
|
||||||
|
#define __UQSUB16 __iar_builtin_UQSUB16
|
||||||
|
#define __UHSUB16 __iar_builtin_UHSUB16
|
||||||
|
#define __SASX __iar_builtin_SASX
|
||||||
|
#define __QASX __iar_builtin_QASX
|
||||||
|
#define __SHASX __iar_builtin_SHASX
|
||||||
|
#define __UASX __iar_builtin_UASX
|
||||||
|
#define __UQASX __iar_builtin_UQASX
|
||||||
|
#define __UHASX __iar_builtin_UHASX
|
||||||
|
#define __SSAX __iar_builtin_SSAX
|
||||||
|
#define __QSAX __iar_builtin_QSAX
|
||||||
|
#define __SHSAX __iar_builtin_SHSAX
|
||||||
|
#define __USAX __iar_builtin_USAX
|
||||||
|
#define __UQSAX __iar_builtin_UQSAX
|
||||||
|
#define __UHSAX __iar_builtin_UHSAX
|
||||||
|
#define __USAD8 __iar_builtin_USAD8
|
||||||
|
#define __USADA8 __iar_builtin_USADA8
|
||||||
|
#define __SSAT16 __iar_builtin_SSAT16
|
||||||
|
#define __USAT16 __iar_builtin_USAT16
|
||||||
|
#define __UXTB16 __iar_builtin_UXTB16
|
||||||
|
#define __UXTAB16 __iar_builtin_UXTAB16
|
||||||
|
#define __SXTB16 __iar_builtin_SXTB16
|
||||||
|
#define __SXTAB16 __iar_builtin_SXTAB16
|
||||||
|
#define __SMUAD __iar_builtin_SMUAD
|
||||||
|
#define __SMUADX __iar_builtin_SMUADX
|
||||||
|
#define __SMMLA __iar_builtin_SMMLA
|
||||||
|
#define __SMLAD __iar_builtin_SMLAD
|
||||||
|
#define __SMLADX __iar_builtin_SMLADX
|
||||||
|
#define __SMLALD __iar_builtin_SMLALD
|
||||||
|
#define __SMLALDX __iar_builtin_SMLALDX
|
||||||
|
#define __SMUSD __iar_builtin_SMUSD
|
||||||
|
#define __SMUSDX __iar_builtin_SMUSDX
|
||||||
|
#define __SMLSD __iar_builtin_SMLSD
|
||||||
|
#define __SMLSDX __iar_builtin_SMLSDX
|
||||||
|
#define __SMLSLD __iar_builtin_SMLSLD
|
||||||
|
#define __SMLSLDX __iar_builtin_SMLSLDX
|
||||||
|
#define __SEL __iar_builtin_SEL
|
||||||
|
#define __QADD __iar_builtin_QADD
|
||||||
|
#define __QSUB __iar_builtin_QSUB
|
||||||
|
#define __PKHBT __iar_builtin_PKHBT
|
||||||
|
#define __PKHTB __iar_builtin_PKHTB
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */
|
||||||
|
|
||||||
|
#if __IAR_M0_FAMILY
|
||||||
|
/* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */
|
||||||
|
#define __CLZ __cmsis_iar_clz_not_active
|
||||||
|
#define __SSAT __cmsis_iar_ssat_not_active
|
||||||
|
#define __USAT __cmsis_iar_usat_not_active
|
||||||
|
#define __RBIT __cmsis_iar_rbit_not_active
|
||||||
|
#define __get_APSR __cmsis_iar_get_APSR_not_active
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||||
|
(defined (__FPU_USED ) && (__FPU_USED == 1U)) ))
|
||||||
|
#define __get_FPSCR __cmsis_iar_get_FPSR_not_active
|
||||||
|
#define __set_FPSCR __cmsis_iar_set_FPSR_not_active
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __INTRINSICS_INCLUDED
|
||||||
|
#error intrinsics.h is already included previously!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <intrinsics.h>
|
||||||
|
|
||||||
|
#if __IAR_M0_FAMILY
|
||||||
|
/* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */
|
||||||
|
#undef __CLZ
|
||||||
|
#undef __SSAT
|
||||||
|
#undef __USAT
|
||||||
|
#undef __RBIT
|
||||||
|
#undef __get_APSR
|
||||||
|
|
||||||
|
__STATIC_INLINE uint8_t __CLZ(uint32_t data)
|
||||||
|
{
|
||||||
|
if (data == 0U) { return 32U; }
|
||||||
|
|
||||||
|
uint32_t count = 0U;
|
||||||
|
uint32_t mask = 0x80000000U;
|
||||||
|
|
||||||
|
while ((data & mask) == 0U)
|
||||||
|
{
|
||||||
|
count += 1U;
|
||||||
|
mask = mask >> 1U;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE uint32_t __RBIT(uint32_t v)
|
||||||
|
{
|
||||||
|
uint8_t sc = 31U;
|
||||||
|
uint32_t r = v;
|
||||||
|
for (v >>= 1U; v; v >>= 1U)
|
||||||
|
{
|
||||||
|
r <<= 1U;
|
||||||
|
r |= v & 1U;
|
||||||
|
sc--;
|
||||||
|
}
|
||||||
|
return (r << sc);
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE uint32_t __get_APSR(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm("MRS %0,APSR" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
|
||||||
|
(defined (__FPU_USED ) && (__FPU_USED == 1U)) ))
|
||||||
|
#undef __get_FPSCR
|
||||||
|
#undef __set_FPSCR
|
||||||
|
#define __get_FPSCR() (0)
|
||||||
|
#define __set_FPSCR(VALUE) ((void)VALUE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#pragma diag_suppress=Pe940
|
||||||
|
#pragma diag_suppress=Pe177
|
||||||
|
|
||||||
|
#define __enable_irq __enable_interrupt
|
||||||
|
#define __disable_irq __disable_interrupt
|
||||||
|
#define __NOP __no_operation
|
||||||
|
|
||||||
|
#define __get_xPSR __get_PSR
|
||||||
|
|
||||||
|
#if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0)
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr)
|
||||||
|
{
|
||||||
|
return __LDREX((unsigned long *)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr)
|
||||||
|
{
|
||||||
|
return __STREX(value, (unsigned long *)ptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */
|
||||||
|
#if (__CORTEX_M >= 0x03)
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __RRX(uint32_t value)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
__ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc");
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __set_BASEPRI_MAX(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR BASEPRI_MAX,%0"::"r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define __enable_fault_irq __enable_fiq
|
||||||
|
#define __disable_fault_irq __disable_fiq
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* (__CORTEX_M >= 0x03) */
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __get_MSPLIM(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure MSPLIM is RAZ/WI
|
||||||
|
res = 0U;
|
||||||
|
#else
|
||||||
|
__asm volatile("MRS %0,MSPLIM" : "=r" (res));
|
||||||
|
#endif
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __set_MSPLIM(uint32_t value)
|
||||||
|
{
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure MSPLIM is RAZ/WI
|
||||||
|
(void)value;
|
||||||
|
#else
|
||||||
|
__asm volatile("MSR MSPLIM,%0" :: "r" (value));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __get_PSPLIM(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
res = 0U;
|
||||||
|
#else
|
||||||
|
__asm volatile("MRS %0,PSPLIM" : "=r" (res));
|
||||||
|
#endif
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __set_PSPLIM(uint32_t value)
|
||||||
|
{
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
(void)value;
|
||||||
|
#else
|
||||||
|
__asm volatile("MSR PSPLIM,%0" :: "r" (value));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_CONTROL_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,CONTROL_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_CONTROL_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR CONTROL_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_PSP_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,PSP_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_PSP_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR PSP_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_MSP_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,MSP_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_MSP_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR MSP_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_SP_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,SP_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
__IAR_FT void __TZ_set_SP_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR SP_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_PRIMASK_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,PRIMASK_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR PRIMASK_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_BASEPRI_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,BASEPRI_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR BASEPRI_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_PSPLIM_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
res = 0U;
|
||||||
|
#else
|
||||||
|
__asm volatile("MRS %0,PSPLIM_NS" : "=r" (res));
|
||||||
|
#endif
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
|
||||||
|
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
|
||||||
|
// without main extensions, the non-secure PSPLIM is RAZ/WI
|
||||||
|
(void)value;
|
||||||
|
#else
|
||||||
|
__asm volatile("MSR PSPLIM_NS,%0" :: "r" (value));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __TZ_get_MSPLIM_NS(void)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__asm volatile("MRS %0,MSPLIM_NS" : "=r" (res));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value)
|
||||||
|
{
|
||||||
|
__asm volatile("MSR MSPLIM_NS,%0" :: "r" (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */
|
||||||
|
|
||||||
|
#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */
|
||||||
|
|
||||||
|
#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value))
|
||||||
|
|
||||||
|
#if __IAR_M0_FAMILY
|
||||||
|
__STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat)
|
||||||
|
{
|
||||||
|
if ((sat >= 1U) && (sat <= 32U))
|
||||||
|
{
|
||||||
|
const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
|
||||||
|
const int32_t min = -1 - max ;
|
||||||
|
if (val > max)
|
||||||
|
{
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
else if (val < min)
|
||||||
|
{
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat)
|
||||||
|
{
|
||||||
|
if (sat <= 31U)
|
||||||
|
{
|
||||||
|
const uint32_t max = ((1U << sat) - 1U);
|
||||||
|
if (val > (int32_t)max)
|
||||||
|
{
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
else if (val < 0)
|
||||||
|
{
|
||||||
|
return 0U;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (uint32_t)val;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */
|
||||||
|
|
||||||
|
__IAR_FT uint8_t __LDRBT(volatile uint8_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
|
||||||
|
return ((uint8_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint16_t __LDRHT(volatile uint16_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
|
||||||
|
return ((uint16_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __LDRT(volatile uint32_t *addr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr)
|
||||||
|
{
|
||||||
|
__ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr)
|
||||||
|
{
|
||||||
|
__ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr)
|
||||||
|
{
|
||||||
|
__ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* (__CORTEX_M >= 0x03) */
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
|
||||||
|
|
||||||
|
|
||||||
|
__IAR_FT uint8_t __LDAB(volatile uint8_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
|
||||||
|
return ((uint8_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint16_t __LDAH(volatile uint16_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
|
||||||
|
return ((uint16_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __LDA(volatile uint32_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr)
|
||||||
|
{
|
||||||
|
__ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr)
|
||||||
|
{
|
||||||
|
__ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr)
|
||||||
|
{
|
||||||
|
__ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
|
||||||
|
return ((uint8_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
|
||||||
|
return ((uint16_t)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr)
|
||||||
|
{
|
||||||
|
uint32_t res;
|
||||||
|
__ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */
|
||||||
|
|
||||||
|
#undef __IAR_FT
|
||||||
|
#undef __IAR_M0_FAMILY
|
||||||
|
#undef __ICCARM_V8
|
||||||
|
|
||||||
|
#pragma diag_default=Pe940
|
||||||
|
#pragma diag_default=Pe177
|
||||||
|
|
||||||
|
#endif /* __CMSIS_ICCARM_H__ */
|
@ -0,0 +1,39 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file cmsis_version.h
|
||||||
|
* @brief CMSIS Core(M) Version definitions
|
||||||
|
* @version V5.0.3
|
||||||
|
* @date 24. June 2019
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2019 ARM Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#elif defined (__clang__)
|
||||||
|
#pragma clang system_header /* treat file as system include file */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __CMSIS_VERSION_H
|
||||||
|
#define __CMSIS_VERSION_H
|
||||||
|
|
||||||
|
/* CMSIS Version definitions */
|
||||||
|
#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */
|
||||||
|
#define __CM_CMSIS_VERSION_SUB ( 3U) /*!< [15:0] CMSIS Core(M) sub version */
|
||||||
|
#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \
|
||||||
|
__CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */
|
||||||
|
#endif
|
2968
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_armv81mml.h
Normal file
2968
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_armv81mml.h
Normal file
File diff suppressed because it is too large
Load Diff
1921
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_armv8mbl.h
Normal file
1921
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_armv8mbl.h
Normal file
File diff suppressed because it is too large
Load Diff
2835
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_armv8mml.h
Normal file
2835
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_armv8mml.h
Normal file
File diff suppressed because it is too large
Load Diff
952
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm0.h
Normal file
952
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm0.h
Normal file
@ -0,0 +1,952 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file core_cm0.h
|
||||||
|
* @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File
|
||||||
|
* @version V5.0.6
|
||||||
|
* @date 13. March 2019
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2019 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#elif defined (__clang__)
|
||||||
|
#pragma clang system_header /* treat file as system include file */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __CORE_CM0_H_GENERIC
|
||||||
|
#define __CORE_CM0_H_GENERIC
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
\page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions
|
||||||
|
CMSIS violates the following MISRA-C:2004 rules:
|
||||||
|
|
||||||
|
\li Required Rule 8.5, object/function definition in header file.<br>
|
||||||
|
Function definitions in header files are used to allow 'inlining'.
|
||||||
|
|
||||||
|
\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
|
||||||
|
Unions are used for effective representation of core registers.
|
||||||
|
|
||||||
|
\li Advisory Rule 19.7, Function-like macro defined.<br>
|
||||||
|
Function-like macros are used to allow more efficient code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* CMSIS definitions
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
\ingroup Cortex_M0
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cmsis_version.h"
|
||||||
|
|
||||||
|
/* CMSIS CM0 definitions */
|
||||||
|
#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */
|
||||||
|
#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */
|
||||||
|
#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \
|
||||||
|
__CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */
|
||||||
|
|
||||||
|
#define __CORTEX_M (0U) /*!< Cortex-M Core */
|
||||||
|
|
||||||
|
/** __FPU_USED indicates whether an FPU is used or not.
|
||||||
|
This core does not support an FPU at all
|
||||||
|
*/
|
||||||
|
#define __FPU_USED 0U
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#if defined __TARGET_FPU_VFP
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
||||||
|
#if defined __ARM_FP
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#if defined __ARMVFP__
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __TI_ARM__ )
|
||||||
|
#if defined __TI_VFP_SUPPORT__
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
#if defined __FPU_VFP__
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ )
|
||||||
|
#if ( __CSMC__ & 0x400U)
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "cmsis_compiler.h" /* CMSIS compiler specific defines */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CM0_H_GENERIC */
|
||||||
|
|
||||||
|
#ifndef __CMSIS_GENERIC
|
||||||
|
|
||||||
|
#ifndef __CORE_CM0_H_DEPENDANT
|
||||||
|
#define __CORE_CM0_H_DEPENDANT
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* check device defines and use defaults */
|
||||||
|
#if defined __CHECK_DEVICE_DEFINES
|
||||||
|
#ifndef __CM0_REV
|
||||||
|
#define __CM0_REV 0x0000U
|
||||||
|
#warning "__CM0_REV not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __NVIC_PRIO_BITS
|
||||||
|
#define __NVIC_PRIO_BITS 2U
|
||||||
|
#warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __Vendor_SysTickConfig
|
||||||
|
#define __Vendor_SysTickConfig 0U
|
||||||
|
#warning "__Vendor_SysTickConfig not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* IO definitions (access restrictions to peripheral registers) */
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_glob_defs CMSIS Global Defines
|
||||||
|
|
||||||
|
<strong>IO Type Qualifiers</strong> are used
|
||||||
|
\li to specify the access to peripheral variables.
|
||||||
|
\li for automatic generation of peripheral register debug information.
|
||||||
|
*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define __I volatile /*!< Defines 'read only' permissions */
|
||||||
|
#else
|
||||||
|
#define __I volatile const /*!< Defines 'read only' permissions */
|
||||||
|
#endif
|
||||||
|
#define __O volatile /*!< Defines 'write only' permissions */
|
||||||
|
#define __IO volatile /*!< Defines 'read / write' permissions */
|
||||||
|
|
||||||
|
/* following defines should be used for structure members */
|
||||||
|
#define __IM volatile const /*! Defines 'read only' structure member permissions */
|
||||||
|
#define __OM volatile /*! Defines 'write only' structure member permissions */
|
||||||
|
#define __IOM volatile /*! Defines 'read / write' structure member permissions */
|
||||||
|
|
||||||
|
/*@} end of group Cortex_M0 */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Register Abstraction
|
||||||
|
Core Register contain:
|
||||||
|
- Core Register
|
||||||
|
- Core NVIC Register
|
||||||
|
- Core SCB Register
|
||||||
|
- Core SysTick Register
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_core_register Defines and Type Definitions
|
||||||
|
\brief Type definitions and defines for Cortex-M processor based devices.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CORE Status and Control Registers
|
||||||
|
\brief Core Register type definitions.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Application Program Status Register (APSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */
|
||||||
|
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
|
||||||
|
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
|
||||||
|
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
|
||||||
|
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} APSR_Type;
|
||||||
|
|
||||||
|
/* APSR Register Definitions */
|
||||||
|
#define APSR_N_Pos 31U /*!< APSR: N Position */
|
||||||
|
#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */
|
||||||
|
|
||||||
|
#define APSR_Z_Pos 30U /*!< APSR: Z Position */
|
||||||
|
#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */
|
||||||
|
|
||||||
|
#define APSR_C_Pos 29U /*!< APSR: C Position */
|
||||||
|
#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */
|
||||||
|
|
||||||
|
#define APSR_V_Pos 28U /*!< APSR: V Position */
|
||||||
|
#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Interrupt Program Status Register (IPSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
|
||||||
|
uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} IPSR_Type;
|
||||||
|
|
||||||
|
/* IPSR Register Definitions */
|
||||||
|
#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */
|
||||||
|
#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Special-Purpose Program Status Registers (xPSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
|
||||||
|
uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */
|
||||||
|
uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */
|
||||||
|
uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */
|
||||||
|
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
|
||||||
|
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
|
||||||
|
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
|
||||||
|
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} xPSR_Type;
|
||||||
|
|
||||||
|
/* xPSR Register Definitions */
|
||||||
|
#define xPSR_N_Pos 31U /*!< xPSR: N Position */
|
||||||
|
#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */
|
||||||
|
|
||||||
|
#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */
|
||||||
|
#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */
|
||||||
|
|
||||||
|
#define xPSR_C_Pos 29U /*!< xPSR: C Position */
|
||||||
|
#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */
|
||||||
|
|
||||||
|
#define xPSR_V_Pos 28U /*!< xPSR: V Position */
|
||||||
|
#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */
|
||||||
|
|
||||||
|
#define xPSR_T_Pos 24U /*!< xPSR: T Position */
|
||||||
|
#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */
|
||||||
|
|
||||||
|
#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */
|
||||||
|
#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Control Registers (CONTROL).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:1; /*!< bit: 0 Reserved */
|
||||||
|
uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */
|
||||||
|
uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} CONTROL_Type;
|
||||||
|
|
||||||
|
/* CONTROL Register Definitions */
|
||||||
|
#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */
|
||||||
|
#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_CORE */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC)
|
||||||
|
\brief Type definitions for the NVIC Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
|
||||||
|
uint32_t RESERVED0[31U];
|
||||||
|
__IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
|
||||||
|
uint32_t RESERVED1[31U];
|
||||||
|
__IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
|
||||||
|
uint32_t RESERVED2[31U];
|
||||||
|
__IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
|
||||||
|
uint32_t RESERVED3[31U];
|
||||||
|
uint32_t RESERVED4[64U];
|
||||||
|
__IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */
|
||||||
|
} NVIC_Type;
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_NVIC */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SCB System Control Block (SCB)
|
||||||
|
\brief Type definitions for the System Control Block Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the System Control Block (SCB).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */
|
||||||
|
__IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */
|
||||||
|
uint32_t RESERVED0;
|
||||||
|
__IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */
|
||||||
|
__IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */
|
||||||
|
__IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */
|
||||||
|
uint32_t RESERVED1;
|
||||||
|
__IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */
|
||||||
|
__IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */
|
||||||
|
} SCB_Type;
|
||||||
|
|
||||||
|
/* SCB CPUID Register Definitions */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */
|
||||||
|
#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */
|
||||||
|
#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */
|
||||||
|
#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */
|
||||||
|
|
||||||
|
/* SCB Interrupt Control State Register Definitions */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */
|
||||||
|
#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */
|
||||||
|
#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */
|
||||||
|
#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */
|
||||||
|
#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB Application Interrupt and Reset Control Register Definitions */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB System Control Register Definitions */
|
||||||
|
#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */
|
||||||
|
#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */
|
||||||
|
|
||||||
|
/* SCB Configuration Control Register Definitions */
|
||||||
|
#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */
|
||||||
|
#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */
|
||||||
|
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */
|
||||||
|
|
||||||
|
/* SCB System Handler Control and State Register Definitions */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SCB */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SysTick System Tick Timer (SysTick)
|
||||||
|
\brief Type definitions for the System Timer Registers.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the System Timer (SysTick).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
|
||||||
|
__IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */
|
||||||
|
__IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */
|
||||||
|
__IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */
|
||||||
|
} SysTick_Type;
|
||||||
|
|
||||||
|
/* SysTick Control / Status Register Definitions */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */
|
||||||
|
#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */
|
||||||
|
#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */
|
||||||
|
|
||||||
|
/* SysTick Reload Register Definitions */
|
||||||
|
#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */
|
||||||
|
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */
|
||||||
|
|
||||||
|
/* SysTick Current Register Definitions */
|
||||||
|
#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */
|
||||||
|
#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */
|
||||||
|
|
||||||
|
/* SysTick Calibration Register Definitions */
|
||||||
|
#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */
|
||||||
|
#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */
|
||||||
|
#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */
|
||||||
|
#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SysTick */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug)
|
||||||
|
\brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor.
|
||||||
|
Therefore they are not covered by the Cortex-M0 header file.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
/*@} end of group CMSIS_CoreDebug */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_core_bitfield Core register bit field macros
|
||||||
|
\brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk).
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Mask and shift a bit field value for use in a register bit range.
|
||||||
|
\param[in] field Name of the register bit field.
|
||||||
|
\param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type.
|
||||||
|
\return Masked and shifted value.
|
||||||
|
*/
|
||||||
|
#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Mask and shift a register value to extract a bit filed value.
|
||||||
|
\param[in] field Name of the register bit field.
|
||||||
|
\param[in] value Value of register. This parameter is interpreted as an uint32_t type.
|
||||||
|
\return Masked and shifted bit field value.
|
||||||
|
*/
|
||||||
|
#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_core_bitfield */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_core_base Core Definitions
|
||||||
|
\brief Definitions for base addresses, unions, and structures.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Memory mapping of Core Hardware */
|
||||||
|
#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */
|
||||||
|
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
|
||||||
|
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
|
||||||
|
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
|
||||||
|
|
||||||
|
#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */
|
||||||
|
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */
|
||||||
|
#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
|
||||||
|
|
||||||
|
|
||||||
|
/*@} */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Hardware Abstraction Layer
|
||||||
|
Core Function Interface contains:
|
||||||
|
- Core NVIC Functions
|
||||||
|
- Core SysTick Functions
|
||||||
|
- Core Register Access Functions
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## NVIC functions #################################### */
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_NVICFunctions NVIC Functions
|
||||||
|
\brief Functions that manage interrupts and exceptions via the NVIC.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CMSIS_NVIC_VIRTUAL
|
||||||
|
#ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE
|
||||||
|
#define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h"
|
||||||
|
#endif
|
||||||
|
#include CMSIS_NVIC_VIRTUAL_HEADER_FILE
|
||||||
|
#else
|
||||||
|
#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping
|
||||||
|
#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping
|
||||||
|
#define NVIC_EnableIRQ __NVIC_EnableIRQ
|
||||||
|
#define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ
|
||||||
|
#define NVIC_DisableIRQ __NVIC_DisableIRQ
|
||||||
|
#define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ
|
||||||
|
#define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ
|
||||||
|
#define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ
|
||||||
|
/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */
|
||||||
|
#define NVIC_SetPriority __NVIC_SetPriority
|
||||||
|
#define NVIC_GetPriority __NVIC_GetPriority
|
||||||
|
#define NVIC_SystemReset __NVIC_SystemReset
|
||||||
|
#endif /* CMSIS_NVIC_VIRTUAL */
|
||||||
|
|
||||||
|
#ifdef CMSIS_VECTAB_VIRTUAL
|
||||||
|
#ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE
|
||||||
|
#define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h"
|
||||||
|
#endif
|
||||||
|
#include CMSIS_VECTAB_VIRTUAL_HEADER_FILE
|
||||||
|
#else
|
||||||
|
#define NVIC_SetVector __NVIC_SetVector
|
||||||
|
#define NVIC_GetVector __NVIC_GetVector
|
||||||
|
#endif /* (CMSIS_VECTAB_VIRTUAL) */
|
||||||
|
|
||||||
|
#define NVIC_USER_IRQ_OFFSET 16
|
||||||
|
|
||||||
|
|
||||||
|
/* The following EXC_RETURN values are saved the LR on exception entry */
|
||||||
|
#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */
|
||||||
|
#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */
|
||||||
|
#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */
|
||||||
|
|
||||||
|
|
||||||
|
/* Interrupt Priorities are WORD accessible only under Armv6-M */
|
||||||
|
/* The following MACROS handle generation of the register offset and byte masks */
|
||||||
|
#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL)
|
||||||
|
#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) )
|
||||||
|
#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) )
|
||||||
|
|
||||||
|
#define __NVIC_SetPriorityGrouping(X) (void)(X)
|
||||||
|
#define __NVIC_GetPriorityGrouping() (0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Enable Interrupt
|
||||||
|
\details Enables a device specific interrupt in the NVIC interrupt controller.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
__COMPILER_BARRIER();
|
||||||
|
NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
__COMPILER_BARRIER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Interrupt Enable status
|
||||||
|
\details Returns a device specific interrupt enable status from the NVIC interrupt controller.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\return 0 Interrupt is not enabled.
|
||||||
|
\return 1 Interrupt is enabled.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(0U);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Disable Interrupt
|
||||||
|
\details Disables a device specific interrupt in the NVIC interrupt controller.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Pending Interrupt
|
||||||
|
\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\return 0 Interrupt status is not pending.
|
||||||
|
\return 1 Interrupt status is pending.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(0U);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Pending Interrupt
|
||||||
|
\details Sets the pending bit of a device specific interrupt in the NVIC pending register.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Clear Pending Interrupt
|
||||||
|
\details Clears the pending bit of a device specific interrupt in the NVIC pending register.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Interrupt Priority
|
||||||
|
\details Sets the priority of a device specific interrupt or a processor exception.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\param [in] priority Priority to set.
|
||||||
|
\note The priority cannot be set for every processor exception.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Interrupt Priority
|
||||||
|
\details Reads the priority of a device specific interrupt or a processor exception.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\return Interrupt Priority.
|
||||||
|
Value is aligned automatically to the implemented priority bits of the microcontroller.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Encode Priority
|
||||||
|
\details Encodes the priority for an interrupt with the given priority group,
|
||||||
|
preemptive priority value, and subpriority value.
|
||||||
|
In case of a conflict between priority grouping and available
|
||||||
|
priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
|
||||||
|
\param [in] PriorityGroup Used priority group.
|
||||||
|
\param [in] PreemptPriority Preemptive priority value (starting from 0).
|
||||||
|
\param [in] SubPriority Subpriority value (starting from 0).
|
||||||
|
\return Encoded priority. Value can be used in the function \ref NVIC_SetPriority().
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
|
||||||
|
{
|
||||||
|
uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
|
||||||
|
uint32_t PreemptPriorityBits;
|
||||||
|
uint32_t SubPriorityBits;
|
||||||
|
|
||||||
|
PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
|
||||||
|
SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
|
||||||
|
|
||||||
|
return (
|
||||||
|
((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
|
||||||
|
((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL)))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Decode Priority
|
||||||
|
\details Decodes an interrupt priority value with a given priority group to
|
||||||
|
preemptive priority value and subpriority value.
|
||||||
|
In case of a conflict between priority grouping and available
|
||||||
|
priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.
|
||||||
|
\param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority().
|
||||||
|
\param [in] PriorityGroup Used priority group.
|
||||||
|
\param [out] pPreemptPriority Preemptive priority value (starting from 0).
|
||||||
|
\param [out] pSubPriority Subpriority value (starting from 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)
|
||||||
|
{
|
||||||
|
uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
|
||||||
|
uint32_t PreemptPriorityBits;
|
||||||
|
uint32_t SubPriorityBits;
|
||||||
|
|
||||||
|
PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
|
||||||
|
SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
|
||||||
|
|
||||||
|
*pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);
|
||||||
|
*pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Interrupt Vector
|
||||||
|
\details Sets an interrupt vector in SRAM based interrupt vector table.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
Address 0 must be mapped to SRAM.
|
||||||
|
\param [in] IRQn Interrupt number
|
||||||
|
\param [in] vector Address of interrupt handler function
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
|
||||||
|
{
|
||||||
|
uint32_t vectors = 0x0U;
|
||||||
|
(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector;
|
||||||
|
/* ARM Application Note 321 states that the M0 does not require the architectural barrier */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Interrupt Vector
|
||||||
|
\details Reads an interrupt vector from interrupt vector table.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\return Address of interrupt handler function
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
uint32_t vectors = 0x0U;
|
||||||
|
return (uint32_t)(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief System Reset
|
||||||
|
\details Initiates a system reset request to reset the MCU.
|
||||||
|
*/
|
||||||
|
__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
|
||||||
|
{
|
||||||
|
__DSB(); /* Ensure all outstanding memory accesses included
|
||||||
|
buffered write are completed before reset */
|
||||||
|
SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
|
||||||
|
SCB_AIRCR_SYSRESETREQ_Msk);
|
||||||
|
__DSB(); /* Ensure completion of memory access */
|
||||||
|
|
||||||
|
for(;;) /* wait until reset */
|
||||||
|
{
|
||||||
|
__NOP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_NVICFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## FPU functions #################################### */
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_FpuFunctions FPU Functions
|
||||||
|
\brief Function that provides FPU type.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief get FPU type
|
||||||
|
\details returns the FPU type
|
||||||
|
\returns
|
||||||
|
- \b 0: No FPU
|
||||||
|
- \b 1: Single precision FPU
|
||||||
|
- \b 2: Double + Single precision FPU
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t SCB_GetFPUType(void)
|
||||||
|
{
|
||||||
|
return 0U; /* No FPU */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_FpuFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ################################## SysTick function ############################################ */
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_SysTickFunctions SysTick Functions
|
||||||
|
\brief Functions that configure the System.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief System Tick Configuration
|
||||||
|
\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.
|
||||||
|
Counter is in free running mode to generate periodic interrupts.
|
||||||
|
\param [in] ticks Number of ticks between two interrupts.
|
||||||
|
\return 0 Function succeeded.
|
||||||
|
\return 1 Function failed.
|
||||||
|
\note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
|
||||||
|
function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
|
||||||
|
must contain a vendor-specific implementation of this function.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
|
||||||
|
{
|
||||||
|
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
|
||||||
|
{
|
||||||
|
return (1UL); /* Reload value impossible */
|
||||||
|
}
|
||||||
|
|
||||||
|
SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
|
||||||
|
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
|
||||||
|
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
||||||
|
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
|
||||||
|
SysTick_CTRL_TICKINT_Msk |
|
||||||
|
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
|
||||||
|
return (0UL); /* Function successful */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_SysTickFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CM0_H_DEPENDANT */
|
||||||
|
|
||||||
|
#endif /* __CMSIS_GENERIC */
|
1085
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm0plus.h
Normal file
1085
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm0plus.h
Normal file
File diff suppressed because it is too large
Load Diff
979
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm1.h
Normal file
979
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm1.h
Normal file
@ -0,0 +1,979 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file core_cm1.h
|
||||||
|
* @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File
|
||||||
|
* @version V1.0.1
|
||||||
|
* @date 12. November 2018
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2018 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#elif defined (__clang__)
|
||||||
|
#pragma clang system_header /* treat file as system include file */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __CORE_CM1_H_GENERIC
|
||||||
|
#define __CORE_CM1_H_GENERIC
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
\page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions
|
||||||
|
CMSIS violates the following MISRA-C:2004 rules:
|
||||||
|
|
||||||
|
\li Required Rule 8.5, object/function definition in header file.<br>
|
||||||
|
Function definitions in header files are used to allow 'inlining'.
|
||||||
|
|
||||||
|
\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
|
||||||
|
Unions are used for effective representation of core registers.
|
||||||
|
|
||||||
|
\li Advisory Rule 19.7, Function-like macro defined.<br>
|
||||||
|
Function-like macros are used to allow more efficient code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* CMSIS definitions
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
\ingroup Cortex_M1
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cmsis_version.h"
|
||||||
|
|
||||||
|
/* CMSIS CM1 definitions */
|
||||||
|
#define __CM1_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */
|
||||||
|
#define __CM1_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */
|
||||||
|
#define __CM1_CMSIS_VERSION ((__CM1_CMSIS_VERSION_MAIN << 16U) | \
|
||||||
|
__CM1_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */
|
||||||
|
|
||||||
|
#define __CORTEX_M (1U) /*!< Cortex-M Core */
|
||||||
|
|
||||||
|
/** __FPU_USED indicates whether an FPU is used or not.
|
||||||
|
This core does not support an FPU at all
|
||||||
|
*/
|
||||||
|
#define __FPU_USED 0U
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#if defined __TARGET_FPU_VFP
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
||||||
|
#if defined __ARM_FP
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#if defined __ARMVFP__
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __TI_ARM__ )
|
||||||
|
#if defined __TI_VFP_SUPPORT__
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
#if defined __FPU_VFP__
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ )
|
||||||
|
#if ( __CSMC__ & 0x400U)
|
||||||
|
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "cmsis_compiler.h" /* CMSIS compiler specific defines */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CM1_H_GENERIC */
|
||||||
|
|
||||||
|
#ifndef __CMSIS_GENERIC
|
||||||
|
|
||||||
|
#ifndef __CORE_CM1_H_DEPENDANT
|
||||||
|
#define __CORE_CM1_H_DEPENDANT
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* check device defines and use defaults */
|
||||||
|
#if defined __CHECK_DEVICE_DEFINES
|
||||||
|
#ifndef __CM1_REV
|
||||||
|
#define __CM1_REV 0x0100U
|
||||||
|
#warning "__CM1_REV not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __NVIC_PRIO_BITS
|
||||||
|
#define __NVIC_PRIO_BITS 2U
|
||||||
|
#warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __Vendor_SysTickConfig
|
||||||
|
#define __Vendor_SysTickConfig 0U
|
||||||
|
#warning "__Vendor_SysTickConfig not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* IO definitions (access restrictions to peripheral registers) */
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_glob_defs CMSIS Global Defines
|
||||||
|
|
||||||
|
<strong>IO Type Qualifiers</strong> are used
|
||||||
|
\li to specify the access to peripheral variables.
|
||||||
|
\li for automatic generation of peripheral register debug information.
|
||||||
|
*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define __I volatile /*!< Defines 'read only' permissions */
|
||||||
|
#else
|
||||||
|
#define __I volatile const /*!< Defines 'read only' permissions */
|
||||||
|
#endif
|
||||||
|
#define __O volatile /*!< Defines 'write only' permissions */
|
||||||
|
#define __IO volatile /*!< Defines 'read / write' permissions */
|
||||||
|
|
||||||
|
/* following defines should be used for structure members */
|
||||||
|
#define __IM volatile const /*! Defines 'read only' structure member permissions */
|
||||||
|
#define __OM volatile /*! Defines 'write only' structure member permissions */
|
||||||
|
#define __IOM volatile /*! Defines 'read / write' structure member permissions */
|
||||||
|
|
||||||
|
/*@} end of group Cortex_M1 */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Register Abstraction
|
||||||
|
Core Register contain:
|
||||||
|
- Core Register
|
||||||
|
- Core NVIC Register
|
||||||
|
- Core SCB Register
|
||||||
|
- Core SysTick Register
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_core_register Defines and Type Definitions
|
||||||
|
\brief Type definitions and defines for Cortex-M processor based devices.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CORE Status and Control Registers
|
||||||
|
\brief Core Register type definitions.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Application Program Status Register (APSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */
|
||||||
|
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
|
||||||
|
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
|
||||||
|
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
|
||||||
|
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} APSR_Type;
|
||||||
|
|
||||||
|
/* APSR Register Definitions */
|
||||||
|
#define APSR_N_Pos 31U /*!< APSR: N Position */
|
||||||
|
#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */
|
||||||
|
|
||||||
|
#define APSR_Z_Pos 30U /*!< APSR: Z Position */
|
||||||
|
#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */
|
||||||
|
|
||||||
|
#define APSR_C_Pos 29U /*!< APSR: C Position */
|
||||||
|
#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */
|
||||||
|
|
||||||
|
#define APSR_V_Pos 28U /*!< APSR: V Position */
|
||||||
|
#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Interrupt Program Status Register (IPSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
|
||||||
|
uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} IPSR_Type;
|
||||||
|
|
||||||
|
/* IPSR Register Definitions */
|
||||||
|
#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */
|
||||||
|
#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Special-Purpose Program Status Registers (xPSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
|
||||||
|
uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */
|
||||||
|
uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */
|
||||||
|
uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */
|
||||||
|
uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
|
||||||
|
uint32_t C:1; /*!< bit: 29 Carry condition code flag */
|
||||||
|
uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
|
||||||
|
uint32_t N:1; /*!< bit: 31 Negative condition code flag */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} xPSR_Type;
|
||||||
|
|
||||||
|
/* xPSR Register Definitions */
|
||||||
|
#define xPSR_N_Pos 31U /*!< xPSR: N Position */
|
||||||
|
#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */
|
||||||
|
|
||||||
|
#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */
|
||||||
|
#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */
|
||||||
|
|
||||||
|
#define xPSR_C_Pos 29U /*!< xPSR: C Position */
|
||||||
|
#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */
|
||||||
|
|
||||||
|
#define xPSR_V_Pos 28U /*!< xPSR: V Position */
|
||||||
|
#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */
|
||||||
|
|
||||||
|
#define xPSR_T_Pos 24U /*!< xPSR: T Position */
|
||||||
|
#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */
|
||||||
|
|
||||||
|
#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */
|
||||||
|
#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Control Registers (CONTROL).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:1; /*!< bit: 0 Reserved */
|
||||||
|
uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */
|
||||||
|
uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */
|
||||||
|
} b; /*!< Structure used for bit access */
|
||||||
|
uint32_t w; /*!< Type used for word access */
|
||||||
|
} CONTROL_Type;
|
||||||
|
|
||||||
|
/* CONTROL Register Definitions */
|
||||||
|
#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */
|
||||||
|
#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_CORE */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC)
|
||||||
|
\brief Type definitions for the NVIC Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
|
||||||
|
uint32_t RESERVED0[31U];
|
||||||
|
__IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
|
||||||
|
uint32_t RSERVED1[31U];
|
||||||
|
__IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
|
||||||
|
uint32_t RESERVED2[31U];
|
||||||
|
__IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
|
||||||
|
uint32_t RESERVED3[31U];
|
||||||
|
uint32_t RESERVED4[64U];
|
||||||
|
__IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */
|
||||||
|
} NVIC_Type;
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_NVIC */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SCB System Control Block (SCB)
|
||||||
|
\brief Type definitions for the System Control Block Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the System Control Block (SCB).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */
|
||||||
|
__IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */
|
||||||
|
uint32_t RESERVED0;
|
||||||
|
__IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */
|
||||||
|
__IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */
|
||||||
|
__IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */
|
||||||
|
uint32_t RESERVED1;
|
||||||
|
__IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */
|
||||||
|
__IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */
|
||||||
|
} SCB_Type;
|
||||||
|
|
||||||
|
/* SCB CPUID Register Definitions */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */
|
||||||
|
#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */
|
||||||
|
#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */
|
||||||
|
#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */
|
||||||
|
|
||||||
|
/* SCB Interrupt Control State Register Definitions */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */
|
||||||
|
#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */
|
||||||
|
#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */
|
||||||
|
#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */
|
||||||
|
#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB Application Interrupt and Reset Control Register Definitions */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB System Control Register Definitions */
|
||||||
|
#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */
|
||||||
|
#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */
|
||||||
|
|
||||||
|
/* SCB Configuration Control Register Definitions */
|
||||||
|
#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */
|
||||||
|
#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */
|
||||||
|
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */
|
||||||
|
|
||||||
|
/* SCB System Handler Control and State Register Definitions */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SCB */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)
|
||||||
|
\brief Type definitions for the System Control and ID Register not in the SCB
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the System Control and ID Register not in the SCB.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t RESERVED0[2U];
|
||||||
|
__IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */
|
||||||
|
} SCnSCB_Type;
|
||||||
|
|
||||||
|
/* Auxiliary Control Register Definitions */
|
||||||
|
#define SCnSCB_ACTLR_ITCMUAEN_Pos 4U /*!< ACTLR: Instruction TCM Upper Alias Enable Position */
|
||||||
|
#define SCnSCB_ACTLR_ITCMUAEN_Msk (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos) /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */
|
||||||
|
|
||||||
|
#define SCnSCB_ACTLR_ITCMLAEN_Pos 3U /*!< ACTLR: Instruction TCM Lower Alias Enable Position */
|
||||||
|
#define SCnSCB_ACTLR_ITCMLAEN_Msk (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos) /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SCnotSCB */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SysTick System Tick Timer (SysTick)
|
||||||
|
\brief Type definitions for the System Timer Registers.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the System Timer (SysTick).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
|
||||||
|
__IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */
|
||||||
|
__IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */
|
||||||
|
__IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */
|
||||||
|
} SysTick_Type;
|
||||||
|
|
||||||
|
/* SysTick Control / Status Register Definitions */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */
|
||||||
|
#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */
|
||||||
|
#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */
|
||||||
|
|
||||||
|
/* SysTick Reload Register Definitions */
|
||||||
|
#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */
|
||||||
|
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */
|
||||||
|
|
||||||
|
/* SysTick Current Register Definitions */
|
||||||
|
#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */
|
||||||
|
#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */
|
||||||
|
|
||||||
|
/* SysTick Calibration Register Definitions */
|
||||||
|
#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */
|
||||||
|
#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */
|
||||||
|
#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */
|
||||||
|
#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SysTick */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug)
|
||||||
|
\brief Cortex-M1 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor.
|
||||||
|
Therefore they are not covered by the Cortex-M1 header file.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
/*@} end of group CMSIS_CoreDebug */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_core_bitfield Core register bit field macros
|
||||||
|
\brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk).
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Mask and shift a bit field value for use in a register bit range.
|
||||||
|
\param[in] field Name of the register bit field.
|
||||||
|
\param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type.
|
||||||
|
\return Masked and shifted value.
|
||||||
|
*/
|
||||||
|
#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Mask and shift a register value to extract a bit filed value.
|
||||||
|
\param[in] field Name of the register bit field.
|
||||||
|
\param[in] value Value of register. This parameter is interpreted as an uint32_t type.
|
||||||
|
\return Masked and shifted bit field value.
|
||||||
|
*/
|
||||||
|
#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_core_bitfield */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_core_base Core Definitions
|
||||||
|
\brief Definitions for base addresses, unions, and structures.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Memory mapping of Core Hardware */
|
||||||
|
#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */
|
||||||
|
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
|
||||||
|
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
|
||||||
|
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
|
||||||
|
|
||||||
|
#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */
|
||||||
|
#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */
|
||||||
|
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */
|
||||||
|
#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
|
||||||
|
|
||||||
|
|
||||||
|
/*@} */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Hardware Abstraction Layer
|
||||||
|
Core Function Interface contains:
|
||||||
|
- Core NVIC Functions
|
||||||
|
- Core SysTick Functions
|
||||||
|
- Core Register Access Functions
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## NVIC functions #################################### */
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_NVICFunctions NVIC Functions
|
||||||
|
\brief Functions that manage interrupts and exceptions via the NVIC.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CMSIS_NVIC_VIRTUAL
|
||||||
|
#ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE
|
||||||
|
#define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h"
|
||||||
|
#endif
|
||||||
|
#include CMSIS_NVIC_VIRTUAL_HEADER_FILE
|
||||||
|
#else
|
||||||
|
#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping
|
||||||
|
#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping
|
||||||
|
#define NVIC_EnableIRQ __NVIC_EnableIRQ
|
||||||
|
#define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ
|
||||||
|
#define NVIC_DisableIRQ __NVIC_DisableIRQ
|
||||||
|
#define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ
|
||||||
|
#define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ
|
||||||
|
#define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ
|
||||||
|
/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M1 */
|
||||||
|
#define NVIC_SetPriority __NVIC_SetPriority
|
||||||
|
#define NVIC_GetPriority __NVIC_GetPriority
|
||||||
|
#define NVIC_SystemReset __NVIC_SystemReset
|
||||||
|
#endif /* CMSIS_NVIC_VIRTUAL */
|
||||||
|
|
||||||
|
#ifdef CMSIS_VECTAB_VIRTUAL
|
||||||
|
#ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE
|
||||||
|
#define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h"
|
||||||
|
#endif
|
||||||
|
#include CMSIS_VECTAB_VIRTUAL_HEADER_FILE
|
||||||
|
#else
|
||||||
|
#define NVIC_SetVector __NVIC_SetVector
|
||||||
|
#define NVIC_GetVector __NVIC_GetVector
|
||||||
|
#endif /* (CMSIS_VECTAB_VIRTUAL) */
|
||||||
|
|
||||||
|
#define NVIC_USER_IRQ_OFFSET 16
|
||||||
|
|
||||||
|
|
||||||
|
/* The following EXC_RETURN values are saved the LR on exception entry */
|
||||||
|
#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */
|
||||||
|
#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */
|
||||||
|
#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */
|
||||||
|
|
||||||
|
|
||||||
|
/* Interrupt Priorities are WORD accessible only under Armv6-M */
|
||||||
|
/* The following MACROS handle generation of the register offset and byte masks */
|
||||||
|
#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL)
|
||||||
|
#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) )
|
||||||
|
#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) )
|
||||||
|
|
||||||
|
#define __NVIC_SetPriorityGrouping(X) (void)(X)
|
||||||
|
#define __NVIC_GetPriorityGrouping() (0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Enable Interrupt
|
||||||
|
\details Enables a device specific interrupt in the NVIC interrupt controller.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
__COMPILER_BARRIER();
|
||||||
|
NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
__COMPILER_BARRIER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Interrupt Enable status
|
||||||
|
\details Returns a device specific interrupt enable status from the NVIC interrupt controller.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\return 0 Interrupt is not enabled.
|
||||||
|
\return 1 Interrupt is enabled.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(0U);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Disable Interrupt
|
||||||
|
\details Disables a device specific interrupt in the NVIC interrupt controller.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Pending Interrupt
|
||||||
|
\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\return 0 Interrupt status is not pending.
|
||||||
|
\return 1 Interrupt status is pending.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(0U);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Pending Interrupt
|
||||||
|
\details Sets the pending bit of a device specific interrupt in the NVIC pending register.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Clear Pending Interrupt
|
||||||
|
\details Clears the pending bit of a device specific interrupt in the NVIC pending register.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Interrupt Priority
|
||||||
|
\details Sets the priority of a device specific interrupt or a processor exception.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\param [in] priority Priority to set.
|
||||||
|
\note The priority cannot be set for every processor exception.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Interrupt Priority
|
||||||
|
\details Reads the priority of a device specific interrupt or a processor exception.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\return Interrupt Priority.
|
||||||
|
Value is aligned automatically to the implemented priority bits of the microcontroller.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Encode Priority
|
||||||
|
\details Encodes the priority for an interrupt with the given priority group,
|
||||||
|
preemptive priority value, and subpriority value.
|
||||||
|
In case of a conflict between priority grouping and available
|
||||||
|
priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
|
||||||
|
\param [in] PriorityGroup Used priority group.
|
||||||
|
\param [in] PreemptPriority Preemptive priority value (starting from 0).
|
||||||
|
\param [in] SubPriority Subpriority value (starting from 0).
|
||||||
|
\return Encoded priority. Value can be used in the function \ref NVIC_SetPriority().
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
|
||||||
|
{
|
||||||
|
uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
|
||||||
|
uint32_t PreemptPriorityBits;
|
||||||
|
uint32_t SubPriorityBits;
|
||||||
|
|
||||||
|
PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
|
||||||
|
SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
|
||||||
|
|
||||||
|
return (
|
||||||
|
((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
|
||||||
|
((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL)))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Decode Priority
|
||||||
|
\details Decodes an interrupt priority value with a given priority group to
|
||||||
|
preemptive priority value and subpriority value.
|
||||||
|
In case of a conflict between priority grouping and available
|
||||||
|
priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.
|
||||||
|
\param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority().
|
||||||
|
\param [in] PriorityGroup Used priority group.
|
||||||
|
\param [out] pPreemptPriority Preemptive priority value (starting from 0).
|
||||||
|
\param [out] pSubPriority Subpriority value (starting from 0).
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)
|
||||||
|
{
|
||||||
|
uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
|
||||||
|
uint32_t PreemptPriorityBits;
|
||||||
|
uint32_t SubPriorityBits;
|
||||||
|
|
||||||
|
PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
|
||||||
|
SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
|
||||||
|
|
||||||
|
*pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);
|
||||||
|
*pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Interrupt Vector
|
||||||
|
\details Sets an interrupt vector in SRAM based interrupt vector table.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
Address 0 must be mapped to SRAM.
|
||||||
|
\param [in] IRQn Interrupt number
|
||||||
|
\param [in] vector Address of interrupt handler function
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
|
||||||
|
{
|
||||||
|
uint32_t *vectors = (uint32_t *)0x0U;
|
||||||
|
vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;
|
||||||
|
/* ARM Application Note 321 states that the M1 does not require the architectural barrier */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Interrupt Vector
|
||||||
|
\details Reads an interrupt vector from interrupt vector table.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\return Address of interrupt handler function
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
uint32_t *vectors = (uint32_t *)0x0U;
|
||||||
|
return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief System Reset
|
||||||
|
\details Initiates a system reset request to reset the MCU.
|
||||||
|
*/
|
||||||
|
__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
|
||||||
|
{
|
||||||
|
__DSB(); /* Ensure all outstanding memory accesses included
|
||||||
|
buffered write are completed before reset */
|
||||||
|
SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
|
||||||
|
SCB_AIRCR_SYSRESETREQ_Msk);
|
||||||
|
__DSB(); /* Ensure completion of memory access */
|
||||||
|
|
||||||
|
for(;;) /* wait until reset */
|
||||||
|
{
|
||||||
|
__NOP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_NVICFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## FPU functions #################################### */
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_FpuFunctions FPU Functions
|
||||||
|
\brief Function that provides FPU type.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief get FPU type
|
||||||
|
\details returns the FPU type
|
||||||
|
\returns
|
||||||
|
- \b 0: No FPU
|
||||||
|
- \b 1: Single precision FPU
|
||||||
|
- \b 2: Double + Single precision FPU
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t SCB_GetFPUType(void)
|
||||||
|
{
|
||||||
|
return 0U; /* No FPU */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_FpuFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ################################## SysTick function ############################################ */
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_SysTickFunctions SysTick Functions
|
||||||
|
\brief Functions that configure the System.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief System Tick Configuration
|
||||||
|
\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.
|
||||||
|
Counter is in free running mode to generate periodic interrupts.
|
||||||
|
\param [in] ticks Number of ticks between two interrupts.
|
||||||
|
\return 0 Function succeeded.
|
||||||
|
\return 1 Function failed.
|
||||||
|
\note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
|
||||||
|
function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
|
||||||
|
must contain a vendor-specific implementation of this function.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
|
||||||
|
{
|
||||||
|
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
|
||||||
|
{
|
||||||
|
return (1UL); /* Reload value impossible */
|
||||||
|
}
|
||||||
|
|
||||||
|
SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
|
||||||
|
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
|
||||||
|
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
|
||||||
|
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
|
||||||
|
SysTick_CTRL_TICKINT_Msk |
|
||||||
|
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
|
||||||
|
return (0UL); /* Function successful */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_SysTickFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CM1_H_DEPENDANT */
|
||||||
|
|
||||||
|
#endif /* __CMSIS_GENERIC */
|
1996
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm23.h
Normal file
1996
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm23.h
Normal file
File diff suppressed because it is too large
Load Diff
1937
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm3.h
Normal file
1937
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm3.h
Normal file
File diff suppressed because it is too large
Load Diff
2910
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm33.h
Normal file
2910
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm33.h
Normal file
File diff suppressed because it is too large
Load Diff
2910
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm35p.h
Normal file
2910
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm35p.h
Normal file
File diff suppressed because it is too large
Load Diff
2124
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm4.h
Normal file
2124
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm4.h
Normal file
File diff suppressed because it is too large
Load Diff
2725
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm7.h
Normal file
2725
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_cm7.h
Normal file
File diff suppressed because it is too large
Load Diff
1025
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_sc000.h
Normal file
1025
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_sc000.h
Normal file
File diff suppressed because it is too large
Load Diff
1912
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_sc300.h
Normal file
1912
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/core_sc300.h
Normal file
File diff suppressed because it is too large
Load Diff
272
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/mpu_armv7.h
Normal file
272
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/mpu_armv7.h
Normal file
@ -0,0 +1,272 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file mpu_armv7.h
|
||||||
|
* @brief CMSIS MPU API for Armv7-M MPU
|
||||||
|
* @version V5.1.0
|
||||||
|
* @date 08. March 2019
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#elif defined (__clang__)
|
||||||
|
#pragma clang system_header /* treat file as system include file */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ARM_MPU_ARMV7_H
|
||||||
|
#define ARM_MPU_ARMV7_H
|
||||||
|
|
||||||
|
#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte
|
||||||
|
#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte
|
||||||
|
#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte
|
||||||
|
#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes
|
||||||
|
|
||||||
|
#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access
|
||||||
|
#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only
|
||||||
|
#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only
|
||||||
|
#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access
|
||||||
|
#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only
|
||||||
|
#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access
|
||||||
|
|
||||||
|
/** MPU Region Base Address Register Value
|
||||||
|
*
|
||||||
|
* \param Region The region to be configured, number 0 to 15.
|
||||||
|
* \param BaseAddress The base address for the region.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RBAR(Region, BaseAddress) \
|
||||||
|
(((BaseAddress) & MPU_RBAR_ADDR_Msk) | \
|
||||||
|
((Region) & MPU_RBAR_REGION_Msk) | \
|
||||||
|
(MPU_RBAR_VALID_Msk))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attributes
|
||||||
|
*
|
||||||
|
* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral.
|
||||||
|
* \param IsShareable Region is shareable between multiple bus masters.
|
||||||
|
* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache.
|
||||||
|
* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \
|
||||||
|
((((TypeExtField) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \
|
||||||
|
(((IsShareable) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \
|
||||||
|
(((IsCacheable) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \
|
||||||
|
(((IsBufferable) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Region Attribute and Size Register Value
|
||||||
|
*
|
||||||
|
* \param DisableExec Instruction access disable bit, 1= disable instruction fetches.
|
||||||
|
* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode.
|
||||||
|
* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_.
|
||||||
|
* \param SubRegionDisable Sub-region disable field.
|
||||||
|
* \param Size Region size of the region to be configured, for example 4K, 8K.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \
|
||||||
|
((((DisableExec) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \
|
||||||
|
(((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \
|
||||||
|
(((AccessAttributes) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) | \
|
||||||
|
(((SubRegionDisable) << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \
|
||||||
|
(((Size) << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \
|
||||||
|
(((MPU_RASR_ENABLE_Msk))))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Region Attribute and Size Register Value
|
||||||
|
*
|
||||||
|
* \param DisableExec Instruction access disable bit, 1= disable instruction fetches.
|
||||||
|
* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode.
|
||||||
|
* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral.
|
||||||
|
* \param IsShareable Region is shareable between multiple bus masters.
|
||||||
|
* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache.
|
||||||
|
* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy.
|
||||||
|
* \param SubRegionDisable Sub-region disable field.
|
||||||
|
* \param Size Region size of the region to be configured, for example 4K, 8K.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \
|
||||||
|
ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute for strongly ordered memory.
|
||||||
|
* - TEX: 000b
|
||||||
|
* - Shareable
|
||||||
|
* - Non-cacheable
|
||||||
|
* - Non-bufferable
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute for device memory.
|
||||||
|
* - TEX: 000b (if shareable) or 010b (if non-shareable)
|
||||||
|
* - Shareable or non-shareable
|
||||||
|
* - Non-cacheable
|
||||||
|
* - Bufferable (if shareable) or non-bufferable (if non-shareable)
|
||||||
|
*
|
||||||
|
* \param IsShareable Configures the device memory as shareable or non-shareable.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute for normal memory.
|
||||||
|
* - TEX: 1BBb (reflecting outer cacheability rules)
|
||||||
|
* - Shareable or non-shareable
|
||||||
|
* - Cacheable or non-cacheable (reflecting inner cacheability rules)
|
||||||
|
* - Bufferable or non-bufferable (reflecting inner cacheability rules)
|
||||||
|
*
|
||||||
|
* \param OuterCp Configures the outer cache policy.
|
||||||
|
* \param InnerCp Configures the inner cache policy.
|
||||||
|
* \param IsShareable Configures the memory as shareable or non-shareable.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) & 2U), ((InnerCp) & 1U))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute non-cacheable policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_CACHEP_NOCACHE 0U
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute write-back, write and read allocate policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_CACHEP_WB_WRA 1U
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute write-through, no write allocate policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_CACHEP_WT_NWA 2U
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute write-back, no write allocate policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_CACHEP_WB_NWA 3U
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Struct for a single MPU Region
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint32_t RBAR; //!< The region base address register value (RBAR)
|
||||||
|
uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR
|
||||||
|
} ARM_MPU_Region_t;
|
||||||
|
|
||||||
|
/** Enable the MPU.
|
||||||
|
* \param MPU_Control Default access permissions for unconfigured regions.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control)
|
||||||
|
{
|
||||||
|
MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Disable the MPU.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Disable(void)
|
||||||
|
{
|
||||||
|
__DMB();
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Clear and disable the given MPU region.
|
||||||
|
* \param rnr Region number to be cleared.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr)
|
||||||
|
{
|
||||||
|
MPU->RNR = rnr;
|
||||||
|
MPU->RASR = 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure an MPU region.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rsar Value for RSAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr)
|
||||||
|
{
|
||||||
|
MPU->RBAR = rbar;
|
||||||
|
MPU->RASR = rasr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure the given MPU region.
|
||||||
|
* \param rnr Region number to be configured.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rsar Value for RSAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr)
|
||||||
|
{
|
||||||
|
MPU->RNR = rnr;
|
||||||
|
MPU->RBAR = rbar;
|
||||||
|
MPU->RASR = rasr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Memcopy with strictly ordered memory access, e.g. for register targets.
|
||||||
|
* \param dst Destination data is copied to.
|
||||||
|
* \param src Source data is copied from.
|
||||||
|
* \param len Amount of data words to be copied.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
for (i = 0U; i < len; ++i)
|
||||||
|
{
|
||||||
|
dst[i] = src[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load the given number of MPU regions from a table.
|
||||||
|
* \param table Pointer to the MPU configuration table.
|
||||||
|
* \param cnt Amount of regions to be configured.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt)
|
||||||
|
{
|
||||||
|
const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U;
|
||||||
|
while (cnt > MPU_TYPE_RALIASES) {
|
||||||
|
ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize);
|
||||||
|
table += MPU_TYPE_RALIASES;
|
||||||
|
cnt -= MPU_TYPE_RALIASES;
|
||||||
|
}
|
||||||
|
ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
346
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/mpu_armv8.h
Normal file
346
modules/Sun_sensor/fw/Drivers/CMSIS/Core/Include/mpu_armv8.h
Normal file
@ -0,0 +1,346 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file mpu_armv8.h
|
||||||
|
* @brief CMSIS MPU API for Armv8-M and Armv8.1-M MPU
|
||||||
|
* @version V5.1.0
|
||||||
|
* @date 08. March 2019
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2019 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#elif defined (__clang__)
|
||||||
|
#pragma clang system_header /* treat file as system include file */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ARM_MPU_ARMV8_H
|
||||||
|
#define ARM_MPU_ARMV8_H
|
||||||
|
|
||||||
|
/** \brief Attribute for device memory (outer only) */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE ( 0U )
|
||||||
|
|
||||||
|
/** \brief Attribute for non-cacheable, normal memory */
|
||||||
|
#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U )
|
||||||
|
|
||||||
|
/** \brief Attribute for normal memory (outer and inner)
|
||||||
|
* \param NT Non-Transient: Set to 1 for non-transient data.
|
||||||
|
* \param WB Write-Back: Set to 1 to use write-back update policy.
|
||||||
|
* \param RA Read Allocation: Set to 1 to use cache allocation on read miss.
|
||||||
|
* \param WA Write Allocation: Set to 1 to use cache allocation on write miss.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \
|
||||||
|
(((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U))
|
||||||
|
|
||||||
|
/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U)
|
||||||
|
|
||||||
|
/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE_nGnRE (1U)
|
||||||
|
|
||||||
|
/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE_nGRE (2U)
|
||||||
|
|
||||||
|
/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE_GRE (3U)
|
||||||
|
|
||||||
|
/** \brief Memory Attribute
|
||||||
|
* \param O Outer memory attributes
|
||||||
|
* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U)))
|
||||||
|
|
||||||
|
/** \brief Normal memory non-shareable */
|
||||||
|
#define ARM_MPU_SH_NON (0U)
|
||||||
|
|
||||||
|
/** \brief Normal memory outer shareable */
|
||||||
|
#define ARM_MPU_SH_OUTER (2U)
|
||||||
|
|
||||||
|
/** \brief Normal memory inner shareable */
|
||||||
|
#define ARM_MPU_SH_INNER (3U)
|
||||||
|
|
||||||
|
/** \brief Memory access permissions
|
||||||
|
* \param RO Read-Only: Set to 1 for read-only memory.
|
||||||
|
* \param NP Non-Privileged: Set to 1 for non-privileged memory.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U))
|
||||||
|
|
||||||
|
/** \brief Region Base Address Register value
|
||||||
|
* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned.
|
||||||
|
* \param SH Defines the Shareability domain for this memory region.
|
||||||
|
* \param RO Read-Only: Set to 1 for a read-only memory region.
|
||||||
|
* \param NP Non-Privileged: Set to 1 for a non-privileged memory region.
|
||||||
|
* \oaram XN eXecute Never: Set to 1 for a non-executable memory region.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \
|
||||||
|
((BASE & MPU_RBAR_BASE_Msk) | \
|
||||||
|
((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \
|
||||||
|
((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \
|
||||||
|
((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk))
|
||||||
|
|
||||||
|
/** \brief Region Limit Address Register value
|
||||||
|
* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended.
|
||||||
|
* \param IDX The attribute index to be associated with this memory region.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RLAR(LIMIT, IDX) \
|
||||||
|
((LIMIT & MPU_RLAR_LIMIT_Msk) | \
|
||||||
|
((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \
|
||||||
|
(MPU_RLAR_EN_Msk))
|
||||||
|
|
||||||
|
#if defined(MPU_RLAR_PXN_Pos)
|
||||||
|
|
||||||
|
/** \brief Region Limit Address Register with PXN value
|
||||||
|
* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended.
|
||||||
|
* \param PXN Privileged execute never. Defines whether code can be executed from this privileged region.
|
||||||
|
* \param IDX The attribute index to be associated with this memory region.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \
|
||||||
|
((LIMIT & MPU_RLAR_LIMIT_Msk) | \
|
||||||
|
((PXN << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \
|
||||||
|
((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \
|
||||||
|
(MPU_RLAR_EN_Msk))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Struct for a single MPU Region
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint32_t RBAR; /*!< Region Base Address Register value */
|
||||||
|
uint32_t RLAR; /*!< Region Limit Address Register value */
|
||||||
|
} ARM_MPU_Region_t;
|
||||||
|
|
||||||
|
/** Enable the MPU.
|
||||||
|
* \param MPU_Control Default access permissions for unconfigured regions.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control)
|
||||||
|
{
|
||||||
|
MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Disable the MPU.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Disable(void)
|
||||||
|
{
|
||||||
|
__DMB();
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Enable the Non-secure MPU.
|
||||||
|
* \param MPU_Control Default access permissions for unconfigured regions.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control)
|
||||||
|
{
|
||||||
|
MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Disable the Non-secure MPU.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Disable_NS(void)
|
||||||
|
{
|
||||||
|
__DMB();
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Set the memory attribute encoding to the given MPU.
|
||||||
|
* \param mpu Pointer to the MPU to be configured.
|
||||||
|
* \param idx The attribute index to be set [0-7]
|
||||||
|
* \param attr The attribute value to be set.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr)
|
||||||
|
{
|
||||||
|
const uint8_t reg = idx / 4U;
|
||||||
|
const uint32_t pos = ((idx % 4U) * 8U);
|
||||||
|
const uint32_t mask = 0xFFU << pos;
|
||||||
|
|
||||||
|
if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) {
|
||||||
|
return; // invalid index
|
||||||
|
}
|
||||||
|
|
||||||
|
mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set the memory attribute encoding.
|
||||||
|
* \param idx The attribute index to be set [0-7]
|
||||||
|
* \param attr The attribute value to be set.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr)
|
||||||
|
{
|
||||||
|
ARM_MPU_SetMemAttrEx(MPU, idx, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Set the memory attribute encoding to the Non-secure MPU.
|
||||||
|
* \param idx The attribute index to be set [0-7]
|
||||||
|
* \param attr The attribute value to be set.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr)
|
||||||
|
{
|
||||||
|
ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Clear and disable the given MPU region of the given MPU.
|
||||||
|
* \param mpu Pointer to MPU to be used.
|
||||||
|
* \param rnr Region number to be cleared.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr)
|
||||||
|
{
|
||||||
|
mpu->RNR = rnr;
|
||||||
|
mpu->RLAR = 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Clear and disable the given MPU region.
|
||||||
|
* \param rnr Region number to be cleared.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr)
|
||||||
|
{
|
||||||
|
ARM_MPU_ClrRegionEx(MPU, rnr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Clear and disable the given Non-secure MPU region.
|
||||||
|
* \param rnr Region number to be cleared.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr)
|
||||||
|
{
|
||||||
|
ARM_MPU_ClrRegionEx(MPU_NS, rnr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Configure the given MPU region of the given MPU.
|
||||||
|
* \param mpu Pointer to MPU to be used.
|
||||||
|
* \param rnr Region number to be configured.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rlar Value for RLAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar)
|
||||||
|
{
|
||||||
|
mpu->RNR = rnr;
|
||||||
|
mpu->RBAR = rbar;
|
||||||
|
mpu->RLAR = rlar;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure the given MPU region.
|
||||||
|
* \param rnr Region number to be configured.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rlar Value for RLAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar)
|
||||||
|
{
|
||||||
|
ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Configure the given Non-secure MPU region.
|
||||||
|
* \param rnr Region number to be configured.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rlar Value for RLAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar)
|
||||||
|
{
|
||||||
|
ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Memcopy with strictly ordered memory access, e.g. for register targets.
|
||||||
|
* \param dst Destination data is copied to.
|
||||||
|
* \param src Source data is copied from.
|
||||||
|
* \param len Amount of data words to be copied.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
for (i = 0U; i < len; ++i)
|
||||||
|
{
|
||||||
|
dst[i] = src[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load the given number of MPU regions from a table to the given MPU.
|
||||||
|
* \param mpu Pointer to the MPU registers to be used.
|
||||||
|
* \param rnr First region number to be configured.
|
||||||
|
* \param table Pointer to the MPU configuration table.
|
||||||
|
* \param cnt Amount of regions to be configured.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)
|
||||||
|
{
|
||||||
|
const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U;
|
||||||
|
if (cnt == 1U) {
|
||||||
|
mpu->RNR = rnr;
|
||||||
|
ARM_MPU_OrderedMemcpy(&(mpu->RBAR), &(table->RBAR), rowWordSize);
|
||||||
|
} else {
|
||||||
|
uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U);
|
||||||
|
uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES;
|
||||||
|
|
||||||
|
mpu->RNR = rnrBase;
|
||||||
|
while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) {
|
||||||
|
uint32_t c = MPU_TYPE_RALIASES - rnrOffset;
|
||||||
|
ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize);
|
||||||
|
table += c;
|
||||||
|
cnt -= c;
|
||||||
|
rnrOffset = 0U;
|
||||||
|
rnrBase += MPU_TYPE_RALIASES;
|
||||||
|
mpu->RNR = rnrBase;
|
||||||
|
}
|
||||||
|
|
||||||
|
ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load the given number of MPU regions from a table.
|
||||||
|
* \param rnr First region number to be configured.
|
||||||
|
* \param table Pointer to the MPU configuration table.
|
||||||
|
* \param cnt Amount of regions to be configured.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)
|
||||||
|
{
|
||||||
|
ARM_MPU_LoadEx(MPU, rnr, table, cnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Load the given number of MPU regions from a table to the Non-secure MPU.
|
||||||
|
* \param rnr First region number to be configured.
|
||||||
|
* \param table Pointer to the MPU configuration table.
|
||||||
|
* \param cnt Amount of regions to be configured.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)
|
||||||
|
{
|
||||||
|
ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,70 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file tz_context.h
|
||||||
|
* @brief Context Management for Armv8-M TrustZone
|
||||||
|
* @version V1.0.1
|
||||||
|
* @date 10. January 2018
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2018 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#pragma system_include /* treat file as system include file for MISRA check */
|
||||||
|
#elif defined (__clang__)
|
||||||
|
#pragma clang system_header /* treat file as system include file */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TZ_CONTEXT_H
|
||||||
|
#define TZ_CONTEXT_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef TZ_MODULEID_T
|
||||||
|
#define TZ_MODULEID_T
|
||||||
|
/// \details Data type that identifies secure software modules called by a process.
|
||||||
|
typedef uint32_t TZ_ModuleId_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// \details TZ Memory ID identifies an allocated memory slot.
|
||||||
|
typedef uint32_t TZ_MemoryId_t;
|
||||||
|
|
||||||
|
/// Initialize secure context memory system
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
uint32_t TZ_InitContextSystem_S (void);
|
||||||
|
|
||||||
|
/// Allocate context memory for calling secure software modules in TrustZone
|
||||||
|
/// \param[in] module identifies software modules called from non-secure mode
|
||||||
|
/// \return value != 0 id TrustZone memory slot identifier
|
||||||
|
/// \return value 0 no memory available or internal error
|
||||||
|
TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module);
|
||||||
|
|
||||||
|
/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S
|
||||||
|
/// \param[in] id TrustZone memory slot identifier
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id);
|
||||||
|
|
||||||
|
/// Load secure context (called on RTOS thread context switch)
|
||||||
|
/// \param[in] id TrustZone memory slot identifier
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
uint32_t TZ_LoadContext_S (TZ_MemoryId_t id);
|
||||||
|
|
||||||
|
/// Store secure context (called on RTOS thread context switch)
|
||||||
|
/// \param[in] id TrustZone memory slot identifier
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
uint32_t TZ_StoreContext_S (TZ_MemoryId_t id);
|
||||||
|
|
||||||
|
#endif // TZ_CONTEXT_H
|
@ -0,0 +1,58 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file main_s.c
|
||||||
|
* @brief Code template for secure main function
|
||||||
|
* @version V1.1.1
|
||||||
|
* @date 10. January 2018
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013-2018 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Use CMSE intrinsics */
|
||||||
|
#include <arm_cmse.h>
|
||||||
|
|
||||||
|
#include "RTE_Components.h"
|
||||||
|
#include CMSIS_device_header
|
||||||
|
|
||||||
|
/* TZ_START_NS: Start address of non-secure application */
|
||||||
|
#ifndef TZ_START_NS
|
||||||
|
#define TZ_START_NS (0x200000U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* typedef for non-secure callback functions */
|
||||||
|
typedef void (*funcptr_void) (void) __attribute__((cmse_nonsecure_call));
|
||||||
|
|
||||||
|
/* Secure main() */
|
||||||
|
int main(void) {
|
||||||
|
funcptr_void NonSecure_ResetHandler;
|
||||||
|
|
||||||
|
/* Add user setup code for secure part here*/
|
||||||
|
|
||||||
|
/* Set non-secure main stack (MSP_NS) */
|
||||||
|
__TZ_set_MSP_NS(*((uint32_t *)(TZ_START_NS)));
|
||||||
|
|
||||||
|
/* Get non-secure reset handler */
|
||||||
|
NonSecure_ResetHandler = (funcptr_void)(*((uint32_t *)((TZ_START_NS) + 4U)));
|
||||||
|
|
||||||
|
/* Start non-secure state software application */
|
||||||
|
NonSecure_ResetHandler();
|
||||||
|
|
||||||
|
/* Non-secure software does not return, this code is not executed */
|
||||||
|
while (1) {
|
||||||
|
__NOP();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,200 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file tz_context.c
|
||||||
|
* @brief Context Management for Armv8-M TrustZone - Sample implementation
|
||||||
|
* @version V1.1.1
|
||||||
|
* @date 10. January 2018
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2018 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "RTE_Components.h"
|
||||||
|
#include CMSIS_device_header
|
||||||
|
#include "tz_context.h"
|
||||||
|
|
||||||
|
/// Number of process slots (threads may call secure library code)
|
||||||
|
#ifndef TZ_PROCESS_STACK_SLOTS
|
||||||
|
#define TZ_PROCESS_STACK_SLOTS 8U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// Stack size of the secure library code
|
||||||
|
#ifndef TZ_PROCESS_STACK_SIZE
|
||||||
|
#define TZ_PROCESS_STACK_SIZE 256U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t sp_top; // stack space top
|
||||||
|
uint32_t sp_limit; // stack space limit
|
||||||
|
uint32_t sp; // current stack pointer
|
||||||
|
} stack_info_t;
|
||||||
|
|
||||||
|
static stack_info_t ProcessStackInfo [TZ_PROCESS_STACK_SLOTS];
|
||||||
|
static uint64_t ProcessStackMemory[TZ_PROCESS_STACK_SLOTS][TZ_PROCESS_STACK_SIZE/8U];
|
||||||
|
static uint32_t ProcessStackFreeSlot = 0xFFFFFFFFU;
|
||||||
|
|
||||||
|
|
||||||
|
/// Initialize secure context memory system
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
__attribute__((cmse_nonsecure_entry))
|
||||||
|
uint32_t TZ_InitContextSystem_S (void) {
|
||||||
|
uint32_t n;
|
||||||
|
|
||||||
|
if (__get_IPSR() == 0U) {
|
||||||
|
return 0U; // Thread Mode
|
||||||
|
}
|
||||||
|
|
||||||
|
for (n = 0U; n < TZ_PROCESS_STACK_SLOTS; n++) {
|
||||||
|
ProcessStackInfo[n].sp = 0U;
|
||||||
|
ProcessStackInfo[n].sp_limit = (uint32_t)&ProcessStackMemory[n];
|
||||||
|
ProcessStackInfo[n].sp_top = (uint32_t)&ProcessStackMemory[n] + TZ_PROCESS_STACK_SIZE;
|
||||||
|
*((uint32_t *)ProcessStackMemory[n]) = n + 1U;
|
||||||
|
}
|
||||||
|
*((uint32_t *)ProcessStackMemory[--n]) = 0xFFFFFFFFU;
|
||||||
|
|
||||||
|
ProcessStackFreeSlot = 0U;
|
||||||
|
|
||||||
|
// Default process stack pointer and stack limit
|
||||||
|
__set_PSPLIM((uint32_t)ProcessStackMemory);
|
||||||
|
__set_PSP ((uint32_t)ProcessStackMemory);
|
||||||
|
|
||||||
|
// Privileged Thread Mode using PSP
|
||||||
|
__set_CONTROL(0x02U);
|
||||||
|
|
||||||
|
return 1U; // Success
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Allocate context memory for calling secure software modules in TrustZone
|
||||||
|
/// \param[in] module identifies software modules called from non-secure mode
|
||||||
|
/// \return value != 0 id TrustZone memory slot identifier
|
||||||
|
/// \return value 0 no memory available or internal error
|
||||||
|
__attribute__((cmse_nonsecure_entry))
|
||||||
|
TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module) {
|
||||||
|
uint32_t slot;
|
||||||
|
|
||||||
|
(void)module; // Ignore (fixed Stack size)
|
||||||
|
|
||||||
|
if (__get_IPSR() == 0U) {
|
||||||
|
return 0U; // Thread Mode
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ProcessStackFreeSlot == 0xFFFFFFFFU) {
|
||||||
|
return 0U; // No slot available
|
||||||
|
}
|
||||||
|
|
||||||
|
slot = ProcessStackFreeSlot;
|
||||||
|
ProcessStackFreeSlot = *((uint32_t *)ProcessStackMemory[slot]);
|
||||||
|
|
||||||
|
ProcessStackInfo[slot].sp = ProcessStackInfo[slot].sp_top;
|
||||||
|
|
||||||
|
return (slot + 1U);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S
|
||||||
|
/// \param[in] id TrustZone memory slot identifier
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
__attribute__((cmse_nonsecure_entry))
|
||||||
|
uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id) {
|
||||||
|
uint32_t slot;
|
||||||
|
|
||||||
|
if (__get_IPSR() == 0U) {
|
||||||
|
return 0U; // Thread Mode
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((id == 0U) || (id > TZ_PROCESS_STACK_SLOTS)) {
|
||||||
|
return 0U; // Invalid ID
|
||||||
|
}
|
||||||
|
|
||||||
|
slot = id - 1U;
|
||||||
|
|
||||||
|
if (ProcessStackInfo[slot].sp == 0U) {
|
||||||
|
return 0U; // Inactive slot
|
||||||
|
}
|
||||||
|
ProcessStackInfo[slot].sp = 0U;
|
||||||
|
|
||||||
|
*((uint32_t *)ProcessStackMemory[slot]) = ProcessStackFreeSlot;
|
||||||
|
ProcessStackFreeSlot = slot;
|
||||||
|
|
||||||
|
return 1U; // Success
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Load secure context (called on RTOS thread context switch)
|
||||||
|
/// \param[in] id TrustZone memory slot identifier
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
__attribute__((cmse_nonsecure_entry))
|
||||||
|
uint32_t TZ_LoadContext_S (TZ_MemoryId_t id) {
|
||||||
|
uint32_t slot;
|
||||||
|
|
||||||
|
if ((__get_IPSR() == 0U) || ((__get_CONTROL() & 2U) == 0U)) {
|
||||||
|
return 0U; // Thread Mode or using Main Stack for threads
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((id == 0U) || (id > TZ_PROCESS_STACK_SLOTS)) {
|
||||||
|
return 0U; // Invalid ID
|
||||||
|
}
|
||||||
|
|
||||||
|
slot = id - 1U;
|
||||||
|
|
||||||
|
if (ProcessStackInfo[slot].sp == 0U) {
|
||||||
|
return 0U; // Inactive slot
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup process stack pointer and stack limit
|
||||||
|
__set_PSPLIM(ProcessStackInfo[slot].sp_limit);
|
||||||
|
__set_PSP (ProcessStackInfo[slot].sp);
|
||||||
|
|
||||||
|
return 1U; // Success
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Store secure context (called on RTOS thread context switch)
|
||||||
|
/// \param[in] id TrustZone memory slot identifier
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
__attribute__((cmse_nonsecure_entry))
|
||||||
|
uint32_t TZ_StoreContext_S (TZ_MemoryId_t id) {
|
||||||
|
uint32_t slot;
|
||||||
|
uint32_t sp;
|
||||||
|
|
||||||
|
if ((__get_IPSR() == 0U) || ((__get_CONTROL() & 2U) == 0U)) {
|
||||||
|
return 0U; // Thread Mode or using Main Stack for threads
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((id == 0U) || (id > TZ_PROCESS_STACK_SLOTS)) {
|
||||||
|
return 0U; // Invalid ID
|
||||||
|
}
|
||||||
|
|
||||||
|
slot = id - 1U;
|
||||||
|
|
||||||
|
if (ProcessStackInfo[slot].sp == 0U) {
|
||||||
|
return 0U; // Inactive slot
|
||||||
|
}
|
||||||
|
|
||||||
|
sp = __get_PSP();
|
||||||
|
if ((sp < ProcessStackInfo[slot].sp_limit) ||
|
||||||
|
(sp > ProcessStackInfo[slot].sp_top)) {
|
||||||
|
return 0U; // SP out of range
|
||||||
|
}
|
||||||
|
ProcessStackInfo[slot].sp = sp;
|
||||||
|
|
||||||
|
// Default process stack pointer and stack limit
|
||||||
|
__set_PSPLIM((uint32_t)ProcessStackMemory);
|
||||||
|
__set_PSP ((uint32_t)ProcessStackMemory);
|
||||||
|
|
||||||
|
return 1U; // Success
|
||||||
|
}
|
@ -0,0 +1,136 @@
|
|||||||
|
cmake_minimum_required (VERSION 3.6)
|
||||||
|
cmake_policy(SET CMP0077 NEW)
|
||||||
|
# The tests are assuming that MATRIX_CHECK is enabled when building
|
||||||
|
# CMSIS-DSP.
|
||||||
|
set(MATRIXCHECK ON)
|
||||||
|
set(FASTMATHCOMPUTATIONS OFF)
|
||||||
|
option(DUMPPATTERN "Dump test patterns when test is failing" ON)
|
||||||
|
|
||||||
|
option(CUSTOMIZE_TESTS "Enable customizations of tests" ON)
|
||||||
|
option(BASICMATH_TESTS "Enable Basic Math testing" ON)
|
||||||
|
option(COMPLEXMATH_TESTS "Enable Complex Math testing" ON)
|
||||||
|
option(CONTROLLER_TESTS "Enable Controller testing" ON)
|
||||||
|
option(FASTMATH_TESTS "Enable Fast Math testing" ON)
|
||||||
|
option(INTRINSICS_TESTS "Enable Intrinsics testing" ON)
|
||||||
|
option(FILTERING_TESTS "Enable Filtering testing" ON)
|
||||||
|
option(MATRIX_TESTS "Enable Matrix testing" ON)
|
||||||
|
option(STATISTICS_TESTS "Enable Statistics testing" ON)
|
||||||
|
option(SUPPORT_TESTS "Enable Support testing" ON)
|
||||||
|
option(TRANSFORM_TESTS "Enable Transform testing" ON)
|
||||||
|
|
||||||
|
|
||||||
|
project(DSP_Lib_TestSuite)
|
||||||
|
|
||||||
|
# Needed to find the config modules
|
||||||
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/..)
|
||||||
|
|
||||||
|
|
||||||
|
set(ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
|
||||||
|
|
||||||
|
|
||||||
|
file(GLOB MAIN "Common/src/*.c")
|
||||||
|
file(GLOB BASICMATH_TESTS_SRC "Common/src/basic_math_tests/*.c")
|
||||||
|
file(GLOB COMPLEXMATH_TESTS_SRC "Common/src/complex_math_tests/*.c")
|
||||||
|
file(GLOB CONTROLLER_TESTS_SRC "Common/src/controller_tests/*.c")
|
||||||
|
file(GLOB FASTMATH_TESTS_SRC "Common/src/fast_math_tests/*.c")
|
||||||
|
file(GLOB FILTERING_TESTS_SRC "Common/src/filtering_tests/*.c")
|
||||||
|
file(GLOB INTRINSINCS_TESTS_SRC "Common/src/intrinsics_tests/*.c")
|
||||||
|
file(GLOB MATRIX_TESTS_SRC "Common/src/matrix_tests/*.c")
|
||||||
|
file(GLOB STATISTICS_TESTS_SRC "Common/src/statistics_tests/*.c")
|
||||||
|
file(GLOB SUPPORT_TESTS_SRC "Common/src/support_tests/*.c")
|
||||||
|
file(GLOB TRANSFORM_TESTS_SRC "Common/src/transform_tests/*.c")
|
||||||
|
file(GLOB JTEST_MAIN "Common/JTest/src/*.c")
|
||||||
|
|
||||||
|
set(TESTSRC ${MAIN}
|
||||||
|
${BASICMATH_TESTS_SRC}
|
||||||
|
${COMPLEXMATH_TESTS_SRC}
|
||||||
|
${CONTROLLER_TESTS_SRC}
|
||||||
|
${FASTMATH_TESTS_SRC}
|
||||||
|
${FILTERING_TESTS_SRC}
|
||||||
|
${INTRINSINCS_TESTS_SRC}
|
||||||
|
${MATRIX_TESTS_SRC}
|
||||||
|
${STATISTICS_TESTS_SRC}
|
||||||
|
${SUPPORT_TESTS_SRC}
|
||||||
|
${TRANSFORM_TESTS_SRC}
|
||||||
|
${JTEST_MAIN}
|
||||||
|
)
|
||||||
|
|
||||||
|
set(JINCS
|
||||||
|
Common/JTest/inc
|
||||||
|
Common/JTest/inc/arr_desc
|
||||||
|
Common/inc/basic_math_tests
|
||||||
|
Common/inc/complex_math_tests
|
||||||
|
Common/inc/controller_tests
|
||||||
|
Common/inc/fast_math_tests
|
||||||
|
Common/inc/filtering_tests
|
||||||
|
Common/inc/intrinsics_tests
|
||||||
|
Common/inc/matrix_tests
|
||||||
|
Common/inc/statistics_tests
|
||||||
|
Common/inc/support_tests
|
||||||
|
Common/inc/transform_tests
|
||||||
|
)
|
||||||
|
|
||||||
|
add_subdirectory(../Source bin_dsp)
|
||||||
|
add_subdirectory(RefLibs bin_ref)
|
||||||
|
|
||||||
|
|
||||||
|
add_executable(DSP_Lib_TestSuite)
|
||||||
|
|
||||||
|
if (CUSTOMIZE_TESTS)
|
||||||
|
target_compile_definitions(DSP_Lib_TestSuite PRIVATE CUSTOMIZE_TESTS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (BASICMATH_TESTS)
|
||||||
|
target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_BASICMATH_TESTS)
|
||||||
|
endif()
|
||||||
|
if (COMPLEXMATH_TESTS)
|
||||||
|
target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_COMPLEXMATH_TESTS)
|
||||||
|
endif()
|
||||||
|
if (CONTROLLER_TESTS)
|
||||||
|
target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_CONTROLLER_TESTS)
|
||||||
|
endif()
|
||||||
|
if (FASTMATH_TESTS)
|
||||||
|
target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_FASTMATH_TESTS)
|
||||||
|
endif()
|
||||||
|
if (FILTERING_TESTS)
|
||||||
|
target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_FILTERING_TESTS)
|
||||||
|
endif()
|
||||||
|
if (INTRINSICS_TESTS)
|
||||||
|
target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_INTRINSICS_TESTS)
|
||||||
|
endif()
|
||||||
|
if (MATRIX_TESTS)
|
||||||
|
target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_MATRIX_TESTS)
|
||||||
|
endif()
|
||||||
|
if (STATISTICS_TESTS)
|
||||||
|
target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_STATISTICS_TESTS)
|
||||||
|
endif()
|
||||||
|
if (SUPPORT_TESTS)
|
||||||
|
target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_SUPPORT_TESTS)
|
||||||
|
endif()
|
||||||
|
if (TRANSFORM_TESTS)
|
||||||
|
target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_TRANSFORM_TESTS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if (DUMPPATTERN)
|
||||||
|
target_compile_definitions(DSP_Lib_TestSuite PRIVATE DUMPPATTERN)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Change behavior of configBoot for scatter file
|
||||||
|
set(TESTFRAMEWORK ON)
|
||||||
|
|
||||||
|
include(configBoot)
|
||||||
|
|
||||||
|
file(COPY ${ROOT}/CMSIS/DSP/Examples/ARM/boot/RTE_Components.h DESTINATION tempLink)
|
||||||
|
|
||||||
|
target_link_libraries(DSP_Lib_TestSuite PRIVATE CMSISDSP)
|
||||||
|
target_link_libraries(DSP_Lib_TestSuite PRIVATE DspRefLibs)
|
||||||
|
|
||||||
|
target_sources(DSP_Lib_TestSuite PRIVATE ${TESTSRC})
|
||||||
|
|
||||||
|
### Includes
|
||||||
|
target_include_directories(DSP_Lib_TestSuite PRIVATE "Common/inc")
|
||||||
|
target_include_directories(DSP_Lib_TestSuite PRIVATE "Common/inc/templates")
|
||||||
|
target_include_directories(DSP_Lib_TestSuite PRIVATE ${JINCS})
|
||||||
|
|
||||||
|
|
@ -0,0 +1,220 @@
|
|||||||
|
#ifndef _ARR_DESC_H_
|
||||||
|
#define _ARR_DESC_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h> /* memset() */
|
||||||
|
#include "../util/util.h" /* CONCAT() */
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array-descriptor struct.
|
||||||
|
*/
|
||||||
|
typedef struct ARR_DESC_struct
|
||||||
|
{
|
||||||
|
void * data_ptr; /* Pointer to the array contents. */
|
||||||
|
int32_t element_count; /* Number of current elements. */
|
||||||
|
int32_t element_size; /* Size of current elements in bytes. */
|
||||||
|
int32_t underlying_size; /* Size of underlying array in bytes. */
|
||||||
|
} ARR_DESC_t;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefix of the array variable's name when creating an array and an array
|
||||||
|
* descriptor at the same time.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_ARR_PREFIX ARR_DESC_ARR_
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate to the array variable's name when creating an array and an array
|
||||||
|
* descriptor at the same time.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_ARR_NAME(name) \
|
||||||
|
CONCAT(ARR_DESC_ARR_PREFIX, name)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define an #ARR_DESC_t by itself.
|
||||||
|
*
|
||||||
|
* @note The user must supply an array to store the data used by the
|
||||||
|
* #ARR_DESC_t.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_INTERNAL_DEFINE(name, data_ptr, \
|
||||||
|
element_count, element_size) \
|
||||||
|
ARR_DESC_t name = { \
|
||||||
|
data_ptr, \
|
||||||
|
element_count, \
|
||||||
|
element_size, \
|
||||||
|
element_count * element_size \
|
||||||
|
} \
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define both an array and an #ARR_DESC_t that describes it.
|
||||||
|
*
|
||||||
|
* @note Use the #CURLY() macro for the content field; it provides the curly
|
||||||
|
* braces necessary for an array initialization.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_DEFINE(type, name, element_count, content) \
|
||||||
|
type ARR_DESC_ARR_NAME(name)[element_count] = content; \
|
||||||
|
ARR_DESC_INTERNAL_DEFINE(name, \
|
||||||
|
&ARR_DESC_ARR_NAME(name), \
|
||||||
|
element_count, \
|
||||||
|
sizeof(type)) /* Note the lacking semicolon */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a #ARR_DESC_t which refers to a subset of the data in another.
|
||||||
|
*
|
||||||
|
* The new #ARR_DESC_t shares the same underlying array as the aliased
|
||||||
|
* #ARR_DESC_t, but only describes a subset of the originals values.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_DEFINE_SUBSET(name, original, element_cnt) \
|
||||||
|
ARR_DESC_INTERNAL_DEFINE(name, \
|
||||||
|
&ARR_DESC_ARR_NAME(original), \
|
||||||
|
element_cnt, \
|
||||||
|
sizeof(ARR_DESC_ARR_NAME(original)[0]) \
|
||||||
|
) /* Note the lacking semicolon */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creat an #ARR_DESC_t which points to the data in an existing array.
|
||||||
|
*
|
||||||
|
* @param start_idx Offset in array_ptr of first element.
|
||||||
|
* @param element_cnt Number of elements to include in the #ARR_DESC_t.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* float my_floats[4] = {0.0f, 1.0f, 2.0f, 3.0f};
|
||||||
|
*
|
||||||
|
* ARR_DESC_DEFINE_USING_ARR(my_arr_desc, my_floats, 1, 3);
|
||||||
|
*
|
||||||
|
* printf("Element 0: %f\n", ARR_DESC_ELT(float, 0, &my_arr_desc));
|
||||||
|
* printf("Element 1: %f\n", ARR_DESC_ELT(float, 1, &my_arr_desc));
|
||||||
|
*
|
||||||
|
* Outputs:
|
||||||
|
*
|
||||||
|
* Element 0: 1.000000
|
||||||
|
* Element 1: 2.000000
|
||||||
|
*
|
||||||
|
* @warning There are no checks in place to catch invalid start indices; This
|
||||||
|
* is left to the user.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_DEFINE_USING_ARR(type, name, array_ptr, start_idx, element_cnt) \
|
||||||
|
ARR_DESC_INTERNAL_DEFINE( \
|
||||||
|
name, \
|
||||||
|
(type *) (array_ptr + start_idx), \
|
||||||
|
element_cnt, \
|
||||||
|
sizeof(type) \
|
||||||
|
) /* Note the lacking semicolon*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declare an #ARR_DESC_t object.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_DECLARE(name) \
|
||||||
|
extern ARR_DESC_t name /* Note the lacking semicolon */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate to the number of bytes stored in the #ARR_DESC_t.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_BYTES(arr_desc_ptr) \
|
||||||
|
((arr_desc_ptr)->element_count * (arr_desc_ptr)->element_size)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the contents of #ARR_DESC_t to value.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_MEMSET(arr_desc_ptr, value, bytes) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
memset((arr_desc_ptr)->data_ptr, \
|
||||||
|
value, \
|
||||||
|
BOUND(0, \
|
||||||
|
(arr_desc_ptr)->underlying_size, \
|
||||||
|
bytes) \
|
||||||
|
); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a memcpy of 'bytes' bytes from the source #ARR_DESC_t to the
|
||||||
|
* destination #ARR_DESC_t.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_MEMCPY(arr_desc_dest_ptr, arr_desc_src_ptr, bytes) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
memcpy((arr_desc_dest_ptr)->data_ptr, \
|
||||||
|
(arr_desc_src_ptr)->data_ptr, \
|
||||||
|
BOUND(0, \
|
||||||
|
(arr_desc_dest_ptr)->underlying_size, \
|
||||||
|
bytes)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate to true if the source #ARR_DESC_t contents will fit into the
|
||||||
|
* destination #ARR_DESC_t and false otherwise.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_COPYABLE(arr_desc_dest_ptr, arr_desc_src_ptr) \
|
||||||
|
(ARR_DESC_BYTES(arr_desc_src_ptr) <= \
|
||||||
|
(arr_desc_dest_ptr)->underlying_size)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy all the data from the source #ARR_DESC_t to the destination
|
||||||
|
* #ARR_DESC_t.
|
||||||
|
*
|
||||||
|
* @note If the destination #ARR_DESC_t is too small to fit the source data the
|
||||||
|
* copy is aborted and nothing happens.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_COPY(arr_desc_dest_ptr, arr_desc_src_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
if (ARR_DESC_COPYABLE(arr_desc_dest_ptr, \
|
||||||
|
arr_desc_src_ptr)) \
|
||||||
|
{ \
|
||||||
|
ARR_DESC_MEMCPY(arr_desc_dest_ptr, \
|
||||||
|
arr_desc_src_ptr, \
|
||||||
|
ARR_DESC_BYTES(arr_desc_src_ptr)); \
|
||||||
|
/* Update the properties*/ \
|
||||||
|
(arr_desc_dest_ptr)->element_count = \
|
||||||
|
(arr_desc_src_ptr)->element_count; \
|
||||||
|
(arr_desc_dest_ptr)->element_size = \
|
||||||
|
(arr_desc_src_ptr)->element_size; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the data in two #ARR_DESC_t structs for the specified number of
|
||||||
|
* bytes.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_MEMCMP(arr_desc_ptr_a, arr_desc_ptr_b, bytes) \
|
||||||
|
memcmp((arr_desc_ptr_a)->data_ptr, \
|
||||||
|
(arr_desc_ptr_b)->data_ptr, \
|
||||||
|
bytes) /* Note the lacking semicolon */ \
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Zero out the contents of the #ARR_DESC_t.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_ZERO(arr_desc_ptr) \
|
||||||
|
ARR_DESC_MEMSET(arr_desc_ptr, \
|
||||||
|
0, \
|
||||||
|
(arr_desc_ptr)->underlying_size)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate to the data address in #ARR_DESC_t at offset.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_DATA_ADDR(type, arr_desc_ptr, offset) \
|
||||||
|
((void*)(((type *) \
|
||||||
|
((arr_desc_ptr)->data_ptr)) \
|
||||||
|
+ offset))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate to the element in #ARR_DESC_t with type at idx.
|
||||||
|
*/
|
||||||
|
#define ARR_DESC_ELT(type, idx, arr_desc_ptr) \
|
||||||
|
(*((type *) ARR_DESC_DATA_ADDR(type, \
|
||||||
|
arr_desc_ptr, \
|
||||||
|
idx)))
|
||||||
|
|
||||||
|
#endif /* _ARR_DESC_H_ */
|
@ -0,0 +1,17 @@
|
|||||||
|
#ifndef _JTEST_H_
|
||||||
|
#define _JTEST_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "jtest_fw.h"
|
||||||
|
#include "jtest_test.h"
|
||||||
|
#include "jtest_test_define.h"
|
||||||
|
#include "jtest_test_call.h"
|
||||||
|
#include "jtest_group.h"
|
||||||
|
#include "jtest_group_define.h"
|
||||||
|
#include "jtest_group_call.h"
|
||||||
|
#include "jtest_cycle.h"
|
||||||
|
|
||||||
|
#endif /* _JTEST_H_ */
|
@ -0,0 +1,79 @@
|
|||||||
|
#ifndef _JTEST_CYCLE_H_
|
||||||
|
#define _JTEST_CYCLE_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "jtest_fw.h" /* JTEST_DUMP_STRF() */
|
||||||
|
#include "jtest_systick.h"
|
||||||
|
#include "jtest_util.h" /* STR() */
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Module Variables */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
extern const char * JTEST_CYCLE_STRF;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap the function call, fn_call, to count execution cycles and display the
|
||||||
|
* results.
|
||||||
|
*/
|
||||||
|
/* skipp function name + param
|
||||||
|
#define JTEST_COUNT_CYCLES(fn_call) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
uint32_t __jtest_cycle_end_count; \
|
||||||
|
\
|
||||||
|
JTEST_SYSTICK_RESET(SysTick); \
|
||||||
|
JTEST_SYSTICK_START(SysTick); \
|
||||||
|
\
|
||||||
|
fn_call; \
|
||||||
|
\
|
||||||
|
__jtest_cycle_end_count = \
|
||||||
|
JTEST_SYSTICK_VALUE(SysTick); \
|
||||||
|
\
|
||||||
|
JTEST_SYSTICK_RESET(SysTick); \
|
||||||
|
JTEST_DUMP_STRF(JTEST_CYCLE_STRF, \
|
||||||
|
STR(fn_call), \
|
||||||
|
(JTEST_SYSTICK_INITIAL_VALUE - \
|
||||||
|
__jtest_cycle_end_count)); \
|
||||||
|
} while (0)
|
||||||
|
*/
|
||||||
|
#ifndef ARMv7A
|
||||||
|
|
||||||
|
#define JTEST_COUNT_CYCLES(fn_call) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
uint32_t __jtest_cycle_end_count; \
|
||||||
|
\
|
||||||
|
JTEST_SYSTICK_RESET(SysTick); \
|
||||||
|
JTEST_SYSTICK_START(SysTick); \
|
||||||
|
\
|
||||||
|
fn_call; \
|
||||||
|
\
|
||||||
|
__jtest_cycle_end_count = \
|
||||||
|
JTEST_SYSTICK_VALUE(SysTick); \
|
||||||
|
\
|
||||||
|
JTEST_SYSTICK_RESET(SysTick); \
|
||||||
|
JTEST_DUMP_STRF(JTEST_CYCLE_STRF, \
|
||||||
|
(JTEST_SYSTICK_INITIAL_VALUE - \
|
||||||
|
__jtest_cycle_end_count)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* TODO */
|
||||||
|
#define JTEST_COUNT_CYCLES(fn_call) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
fn_call; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _JTEST_CYCLE_H_ */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,37 @@
|
|||||||
|
#ifndef _JTEST_DEFINE_H_
|
||||||
|
#define _JTEST_DEFINE_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes a symbol for use as a struct name. Names made this way have two parts;
|
||||||
|
* the first parts is a prefix common to all structs of that class. The second
|
||||||
|
* is a specifier which differs for each instance of that struct type.
|
||||||
|
*/
|
||||||
|
#define JTEST_STRUCT_NAME(prefix, specifier) \
|
||||||
|
CONCAT(prefix, specifier)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define a struct with type with a name generated by #JTEST_STRUCT_NAME().
|
||||||
|
*/
|
||||||
|
#define JTEST_DEFINE_STRUCT(type, struct_name) \
|
||||||
|
type struct_name
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declare a struct with type with a name generated by #JTEST_STRUCT_NAME().
|
||||||
|
*/
|
||||||
|
#define JTEST_DECLARE_STRUCT(struct_definition) \
|
||||||
|
extern struct_definition
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define and initialize a struct (created with JTEST_DEFINE_STRUCT()) and
|
||||||
|
* initialize it with init_values.
|
||||||
|
*/
|
||||||
|
#define JTEST_INIT_STRUCT(struct_definition, init_values) \
|
||||||
|
struct_definition = { \
|
||||||
|
init_values \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _JTEST_DEFINE_H_ */
|
@ -0,0 +1,282 @@
|
|||||||
|
#ifndef _JTEST_FW_H_
|
||||||
|
#define _JTEST_FW_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include <stdint.h> /* int32_t */
|
||||||
|
#include <string.h> /* strcpy() */
|
||||||
|
#include <stdio.h> /* sprintf() */
|
||||||
|
#include "jtest_pf.h" /* Extend JTEST_FW_t with Pass/Fail data */
|
||||||
|
#include "jtest_group.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A struct used to interface with the Keil Debugger.
|
||||||
|
*/
|
||||||
|
typedef struct JTEST_FW_struct
|
||||||
|
{
|
||||||
|
/* Action Triggers: The Keil debugger monitors these values for changes. In
|
||||||
|
* response to a change, the debugger executes code on the host. */
|
||||||
|
volatile int32_t test_start;
|
||||||
|
volatile int32_t test_end;
|
||||||
|
volatile int32_t group_start;
|
||||||
|
volatile int32_t group_end;
|
||||||
|
volatile int32_t dump_str;
|
||||||
|
volatile int32_t dump_data;
|
||||||
|
volatile int32_t exit_fw;
|
||||||
|
|
||||||
|
JTEST_GROUP_t * current_group_ptr;
|
||||||
|
|
||||||
|
/* Buffers: The C-code cannot send strings and data directly to the
|
||||||
|
* debugging framework. Instead, the debugger can be told to read 128 byte
|
||||||
|
* (by default) chunks of memory. Data received in this manner requires
|
||||||
|
* post-processing to be legible.*/
|
||||||
|
char * str_buffer;
|
||||||
|
char * data_buffer;
|
||||||
|
|
||||||
|
/* Pass/Fail Data */
|
||||||
|
JTEST_PF_MEMBERS;
|
||||||
|
|
||||||
|
} JTEST_FW_t;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default name for the JTEST_FW struct.
|
||||||
|
*
|
||||||
|
* Define your own if you want the variable containing the #JTEST_FW_t to have
|
||||||
|
* a different name.
|
||||||
|
*/
|
||||||
|
#ifndef JTEST_FW
|
||||||
|
#define JTEST_FW JTEST_FW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default name for the JTEST_FW_STR_BUFFER.
|
||||||
|
*
|
||||||
|
* Define your own if you want the variable containing the char buffer to have
|
||||||
|
* a different name.
|
||||||
|
*/
|
||||||
|
#ifndef JTEST_FW_STR_BUFFER
|
||||||
|
#define JTEST_FW_STR_BUFFER JTEST_FW_STR_BUFFER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Size of the #JTEST_FW_t, output string-buffer.
|
||||||
|
*
|
||||||
|
* If you change this value, make sure the "dump_str_fn" and "dump_data_fn"
|
||||||
|
* functions in jtest_fns.ini uses the same size. If you aren't sure, read the
|
||||||
|
* documentation Keil Debugger Command 'DISPLAY'.
|
||||||
|
*/
|
||||||
|
#define JTEST_BUF_SIZE 256
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum number of bytes output at once using #JTEST_DUMP_STRF().
|
||||||
|
*/
|
||||||
|
#define JTEST_STR_MAX_OUTPUT_SIZE 128
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum number of block transimissions needed to send a string from a
|
||||||
|
* buffer with JTEST_BUF_SIZE.
|
||||||
|
*/
|
||||||
|
#define JTEST_STR_MAX_OUTPUT_SEGMENTS \
|
||||||
|
(JTEST_BUF_SIZE / JTEST_STR_MAX_OUTPUT_SIZE)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the JTEST framework.
|
||||||
|
*/
|
||||||
|
#define JTEST_INIT() \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_FW.str_buffer = JTEST_FW_STR_BUFFER; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Debugger Action-triggering Macros */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatch macro to trigger various actions in the Keil Debugger.
|
||||||
|
*/
|
||||||
|
#define JTEST_TRIGGER_ACTION(action_name) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
action_name(); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trigger the "Test Start" action in the Keil Debugger.
|
||||||
|
*/
|
||||||
|
#define JTEST_ACT_TEST_START() \
|
||||||
|
JTEST_TRIGGER_ACTION(test_start)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trigger the "Test End" action in the Keil Debugger.
|
||||||
|
*/
|
||||||
|
#define JTEST_ACT_TEST_END() \
|
||||||
|
JTEST_TRIGGER_ACTION(test_end)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trigger the "Group Start" action in the Keil Debugger.
|
||||||
|
*/
|
||||||
|
#define JTEST_ACT_GROUP_START() \
|
||||||
|
JTEST_TRIGGER_ACTION(group_start)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trigger the "Group End" action in the Keil Debugger.
|
||||||
|
*/
|
||||||
|
#define JTEST_ACT_GROUP_END() \
|
||||||
|
JTEST_TRIGGER_ACTION(group_end)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fill the buffer named buf_name with value and dump it to the Keil debugger
|
||||||
|
* using action.
|
||||||
|
*/
|
||||||
|
#if defined(ARMv7A) || defined(FILEIO)
|
||||||
|
|
||||||
|
#define JTEST_ACT_DUMP(action, buf_name, value) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_CLEAR_BUFFER(buf_name); \
|
||||||
|
printf("%s",value); \
|
||||||
|
strcpy(JTEST_FW.buf_name, (value)); \
|
||||||
|
JTEST_TRIGGER_ACTION(action); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define JTEST_ACT_DUMP(action, buf_name, value) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_CLEAR_BUFFER(buf_name); \
|
||||||
|
strcpy(JTEST_FW.buf_name, (value)); \
|
||||||
|
JTEST_TRIGGER_ACTION(action); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* Trigger the "Exit Framework" action in the Keil Debugger.
|
||||||
|
*/
|
||||||
|
#define JTEST_ACT_EXIT_FW() \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_TRIGGER_ACTION(exit_fw); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* Buffer Manipulation Macros */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the JTEST_FW buffer with name buf_name.
|
||||||
|
*/
|
||||||
|
#define JTEST_CLEAR_BUFFER(buf_name) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
memset(JTEST_FW.buf_name, 0, JTEST_BUF_SIZE); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the memory needed for the JTEST_FW's string buffer.
|
||||||
|
*/
|
||||||
|
#define JTEST_CLEAR_STR_BUFFER() \
|
||||||
|
JTEST_CLEAR_BUFFER(str_buffer)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the memory needed for the JTEST_FW's data buffer.
|
||||||
|
*/
|
||||||
|
#define JTEST_CLEAR_DATA_BUFFER() \
|
||||||
|
JTEST_CLEAR_BUFFER(data_buffer)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump the given string to the Keil Debugger.
|
||||||
|
*/
|
||||||
|
#define JTEST_DUMP_STR(string) \
|
||||||
|
JTEST_ACT_DUMP(dump_str, str_buffer, string)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump a formatted string to the Keil Debugger.
|
||||||
|
*/
|
||||||
|
#if defined(ARMv7A) || defined(FILEIO)
|
||||||
|
|
||||||
|
#define JTEST_DUMP_STRF(format_str, ... ) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_CLEAR_STR_BUFFER(); \
|
||||||
|
sprintf(JTEST_FW.str_buffer,format_str, __VA_ARGS__); \
|
||||||
|
printf("%s",JTEST_FW.str_buffer); \
|
||||||
|
jtest_dump_str_segments(); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define JTEST_DUMP_STRF(format_str, ... ) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_CLEAR_STR_BUFFER(); \
|
||||||
|
sprintf(JTEST_FW.str_buffer,format_str, __VA_ARGS__); \
|
||||||
|
jtest_dump_str_segments(); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Pass/Fail Macros */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increment the number of passed tests in #JTEST_FW.
|
||||||
|
*/
|
||||||
|
#define JTEST_FW_INC_PASSED(amount) \
|
||||||
|
JTEST_PF_INC_PASSED(&JTEST_FW, amount)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increment the number of passed tests in #JTEST_FW.
|
||||||
|
*/
|
||||||
|
#define JTEST_FW_INC_FAILED(amount) \
|
||||||
|
JTEST_PF_INC_FAILED(&JTEST_FW, amount)
|
||||||
|
|
||||||
|
/* Manipulating the Current Group */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate to the current_group_ptr in #JTEST_FW.
|
||||||
|
*/
|
||||||
|
#define JTEST_CURRENT_GROUP_PTR() \
|
||||||
|
(JTEST_FW.current_group_ptr)
|
||||||
|
|
||||||
|
#define JTEST_SET_CURRENT_GROUP(group_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_CURRENT_GROUP_PTR() = group_ptr; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Global Variables */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
extern char JTEST_FW_STR_BUFFER[JTEST_BUF_SIZE];
|
||||||
|
extern volatile JTEST_FW_t JTEST_FW;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Function Prototypes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
void jtest_dump_str_segments(void);
|
||||||
|
|
||||||
|
void test_start (void);
|
||||||
|
void test_end (void);
|
||||||
|
void group_start (void);
|
||||||
|
void group_end (void);
|
||||||
|
void dump_str (void);
|
||||||
|
void dump_data (void);
|
||||||
|
void exit_fw (void);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _JTEST_FW_H_ */
|
@ -0,0 +1,66 @@
|
|||||||
|
#ifndef _JTEST_GROUP_H_
|
||||||
|
#define _JTEST_GROUP_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "jtest_pf.h"
|
||||||
|
#include "jtest_util.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A struct which represents a group of #JTEST_TEST_t structs. This struct is
|
||||||
|
* used to run the group of tests, and report on their outcomes.
|
||||||
|
*/
|
||||||
|
typedef struct JTEST_GROUP_struct
|
||||||
|
{
|
||||||
|
void (* group_fn_ptr) (void); /**< Pointer to the test group */
|
||||||
|
char * name_str; /**< Name of the group */
|
||||||
|
|
||||||
|
/* Extend the #JTEST_GROUP_t with Pass/Fail information.*/
|
||||||
|
JTEST_PF_MEMBERS;
|
||||||
|
} JTEST_GROUP_t;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the name of JTEST_GROUP_t.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_SET_NAME(group_ptr, name) \
|
||||||
|
JTEST_SET_STRUCT_ATTRIBUTE(group_ptr, name_str, name)
|
||||||
|
|
||||||
|
#define JTEST_GROUP_SET_FN(group_ptr, fn_ptr) \
|
||||||
|
JTEST_SET_STRUCT_ATTRIBUTE(group_ptr, group_fn_ptr, fn_ptr)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increment the number of tests passed in the JTEST_GROUP_t pointed to by
|
||||||
|
* group_ptr.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_INC_PASSED(group_ptr, amount) \
|
||||||
|
JTEST_PF_INC_PASSED(group_ptr, amount)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increment the number of tests failed in the JTEST_GROUP_t pointed to by
|
||||||
|
* group_ptr.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_INC_FAILED(group_ptr, amount) \
|
||||||
|
JTEST_PF_INC_FAILED(group_ptr, amount)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the pass/fail information of the #JTEST_GROUP_t pointed to by
|
||||||
|
* group_ptr.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_RESET_PF(group_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_PF_RESET_PASSED(group_ptr); \
|
||||||
|
JTEST_PF_RESET_FAILED(group_ptr); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* _JTEST_GROUP_H_ */
|
@ -0,0 +1,126 @@
|
|||||||
|
#ifndef _JTEST_GROUP_CALL_H_
|
||||||
|
#define _JTEST_GROUP_CALL_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "jtest_fw.h"
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the test in the #JTEST_GROUP_t struct associated witht he identifier
|
||||||
|
* group_fn.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_RUN(group_fn) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_DUMP_STR("Group Name:\n"); \
|
||||||
|
JTEST_DUMP_STR(JTEST_GROUP_STRUCT_NAME(group_fn).name_str); \
|
||||||
|
JTEST_GROUP_STRUCT_NAME(group_fn).group_fn_ptr(); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the enclosing #JTEST_GROUP_t's pass/fail information using the
|
||||||
|
* current #JTEST_GROUP_t's.
|
||||||
|
*
|
||||||
|
* @param group_ptr Pointer to the current #JTEST_GROUP_t.
|
||||||
|
* @param parent_ptr Pointer to the enclosing #JTEST_GROUP_t.
|
||||||
|
*
|
||||||
|
* @warning Only run this if the current #JTEST_GROUP_t is being called within
|
||||||
|
* the context of another #JTEST_GROUP_t.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_UPDATE_PARENT_GROUP_PF(group_ptr, parent_group_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_GROUP_INC_PASSED(parent_group_ptr, \
|
||||||
|
(group_ptr)->passed); \
|
||||||
|
JTEST_GROUP_INC_FAILED(parent_group_ptr, \
|
||||||
|
(group_ptr)->failed); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the #JTEST_FW's pass/fail information using the current
|
||||||
|
* #JTEST_GROUP_t's.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_UPDATE_FW_PF(group_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_FW_INC_PASSED((group_ptr)->passed); \
|
||||||
|
JTEST_FW_INC_FAILED((group_ptr)->failed); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the enclosing context with the current #JTEST_GROUP_t's pass/fail
|
||||||
|
* information. If this group isn't in an enclosing group, it updates the
|
||||||
|
* #JTEST_FW's pass/fail info by default.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_UPDATE_PARENT_GROUP_OR_FW_PF(group_ptr, \
|
||||||
|
parent_group_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
/* Update the pass fail counts in the parent group */ \
|
||||||
|
if (parent_group_ptr /* Null implies Top*/) \
|
||||||
|
{ \
|
||||||
|
JTEST_GROUP_UPDATE_PARENT_GROUP_PF( \
|
||||||
|
group_ptr, \
|
||||||
|
parent_group_ptr); \
|
||||||
|
} else { \
|
||||||
|
JTEST_GROUP_UPDATE_FW_PF( \
|
||||||
|
group_ptr); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump the results of running the #JTEST_GROUP_t to the Keil Debugger.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_DUMP_RESULTS(group_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_DUMP_STRF( \
|
||||||
|
"Tests Run: %" PRIu32 "\n" \
|
||||||
|
"----------\n" \
|
||||||
|
" Passed: %" PRIu32 "\n" \
|
||||||
|
" Failed: %" PRIu32 "\n", \
|
||||||
|
(group_ptr)->passed + (group_ptr)->failed, \
|
||||||
|
(group_ptr)->passed, \
|
||||||
|
(group_ptr)->failed); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call the #JTEST_GROUP_t associated with the identifier group_fn.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_CALL(group_fn) \
|
||||||
|
do \
|
||||||
|
{ /* Save the current group from JTEST_FW_t before swapping */ \
|
||||||
|
/* it to this group (in order to restore it later )*/ \
|
||||||
|
JTEST_GROUP_t * __jtest_temp_group_ptr = \
|
||||||
|
JTEST_CURRENT_GROUP_PTR(); \
|
||||||
|
JTEST_SET_CURRENT_GROUP(&JTEST_GROUP_STRUCT_NAME(group_fn)); \
|
||||||
|
\
|
||||||
|
/* Reset this group's pass/fail count. Each group */ \
|
||||||
|
/* should only remember counts for its last execution. */ \
|
||||||
|
JTEST_GROUP_RESET_PF(JTEST_CURRENT_GROUP_PTR()); \
|
||||||
|
\
|
||||||
|
/* Run the current group */ \
|
||||||
|
JTEST_ACT_GROUP_START(); \
|
||||||
|
JTEST_GROUP_RUN(group_fn); \
|
||||||
|
JTEST_ACT_GROUP_END(); \
|
||||||
|
\
|
||||||
|
/* Update the pass fail counts in the parent group (or FW) */ \
|
||||||
|
JTEST_GROUP_UPDATE_PARENT_GROUP_OR_FW_PF( \
|
||||||
|
JTEST_CURRENT_GROUP_PTR(), \
|
||||||
|
__jtest_temp_group_ptr); \
|
||||||
|
\
|
||||||
|
JTEST_GROUP_DUMP_RESULTS(JTEST_CURRENT_GROUP_PTR()); \
|
||||||
|
\
|
||||||
|
/* Restore the previously current group */ \
|
||||||
|
JTEST_SET_CURRENT_GROUP(__jtest_temp_group_ptr); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* _JTEST_GROUP_CALL_H_ */
|
@ -0,0 +1,87 @@
|
|||||||
|
#ifndef _JTEST_GROUP_DEFINE_H_
|
||||||
|
#define _JTEST_GROUP_DEFINE_H_
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "jtest_util.h"
|
||||||
|
#include "jtest_define.h"
|
||||||
|
#include "jtest_group.h"
|
||||||
|
|
||||||
|
/* For defining macros with optional arguments */
|
||||||
|
#include "opt_arg/opt_arg.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefix for all #JTEST_GROUP_t structs.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_STRUCT_NAME_PREFIX G_JTEST_GROUP_STRUCT_
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define test template used by #JTEST_GROUP_t tests.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_FN_TEMPLATE(group_fn) \
|
||||||
|
void group_fn(void)
|
||||||
|
|
||||||
|
#define JTEST_GROUP_FN_PROTOTYPE JTEST_GROUP_FN_TEMPLATE /**< Alias for
|
||||||
|
#JTEST_GROUP_FN_TEMPLATE. */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate to the name of the #JTEST_GROUP_t struct associated with group_fn.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_STRUCT_NAME(group_fn) \
|
||||||
|
JTEST_STRUCT_NAME(JTEST_GROUP_STRUCT_NAME_PREFIX, group_fn)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define a #JTEST_GROUP_t struct based on the given group_fn.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_DEFINE_STRUCT(group_fn) \
|
||||||
|
JTEST_DEFINE_STRUCT(JTEST_GROUP_t, \
|
||||||
|
JTEST_GROUP_STRUCT_NAME(group_fn))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declare a #JTEST_GROUP_t struct based on the given group_fn.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_DECLARE_STRUCT(group_fn) \
|
||||||
|
JTEST_DECLARE_STRUCT(JTEST_GROUP_DEFINE_STRUCT(group_fn))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contents needed to initialize a JTEST_GROUP_t struct.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_STRUCT_INIT(group_fn) \
|
||||||
|
group_fn, \
|
||||||
|
STR_NL(group_fn), \
|
||||||
|
JTEST_PF_MEMBER_INIT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the contents of a #JTEST_GROUP_t struct.
|
||||||
|
*/
|
||||||
|
#define JTEST_GROUP_INIT(group_fn) \
|
||||||
|
JTEST_GROUP_DEFINE_STRUCT(group_fn) = { \
|
||||||
|
JTEST_GROUP_STRUCT_INIT(group_fn) \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test Definition Macro */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define a #JTEST_GROUP_t object and a test function.
|
||||||
|
*/
|
||||||
|
#define JTEST_DEFINE_GROUP(group_fn) \
|
||||||
|
JTEST_GROUP_FN_PROTOTYPE(group_fn); \
|
||||||
|
JTEST_GROUP_INIT(group_fn); \
|
||||||
|
JTEST_GROUP_FN_PROTOTYPE(group_fn) /* Notice the lacking semicolon */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declare a #JTEST_GROUP_t object and a test function prototype.
|
||||||
|
*/
|
||||||
|
#define JTEST_DECLARE_GROUP(group_fn) \
|
||||||
|
JTEST_GROUP_FN_PROTOTYPE(group_fn); \
|
||||||
|
JTEST_GROUP_DECLARE_STRUCT(group_fn) /* Note the lacking semicolon */
|
||||||
|
|
||||||
|
#endif /* _JTEST_GROUP_DEFINE_H_ */
|
@ -0,0 +1,85 @@
|
|||||||
|
#ifndef _JTEST_PF_H_
|
||||||
|
#define _JTEST_PF_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Purpose */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* jtest_pf.h Contains macros useful for capturing pass/fail data. */
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Members that can be added to other structs to extend them pass/fail data and
|
||||||
|
* corresponding functionality.
|
||||||
|
*/
|
||||||
|
#define JTEST_PF_MEMBERS \
|
||||||
|
uint32_t passed; \
|
||||||
|
uint32_t failed /* Note the lacking semicolon*/ \
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used for initializing JTEST_PF_MEMBERS in a struct declaration.
|
||||||
|
*/
|
||||||
|
#define JTEST_PF_MEMBER_INIT \
|
||||||
|
0, \
|
||||||
|
0
|
||||||
|
|
||||||
|
/* Member-Incrementing Macros */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatch macro for incrementing #JTEST_PF_MEMBERS.
|
||||||
|
*
|
||||||
|
* @param xxx Values: 'passed', 'failed'
|
||||||
|
*/
|
||||||
|
#define JTEST_PF_INC_XXX(xxx, struct_pf_ptr, amount) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
((struct_pf_ptr)->xxx) += (amount); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of the #JTEST_PF_INC_XXX macro to increment the passed
|
||||||
|
* member.
|
||||||
|
*/
|
||||||
|
#define JTEST_PF_INC_PASSED(struct_pf_ptr, amount) \
|
||||||
|
JTEST_PF_INC_XXX(passed, struct_pf_ptr, amount)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of the #JTEST_PF_INC_XXX macro to increment the failed
|
||||||
|
* member.
|
||||||
|
*/
|
||||||
|
#define JTEST_PF_INC_FAILED(struct_pf_ptr, amount) \
|
||||||
|
JTEST_PF_INC_XXX(failed, struct_pf_ptr, amount)
|
||||||
|
|
||||||
|
|
||||||
|
/* Member-Resetting Macros */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatch macro for setting #JTEST_PF_MEMBERS to zero.
|
||||||
|
*
|
||||||
|
* @param xxx Values: 'passed', 'failed'
|
||||||
|
*/
|
||||||
|
#define JTEST_PF_RESET_XXX(xxx, struct_pf_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
((struct_pf_ptr)->xxx) = UINT32_C(0); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of #JTEST_PF_RESET_XXX for the 'passed' member.
|
||||||
|
*/
|
||||||
|
#define JTEST_PF_RESET_PASSED(struct_pf_ptr) \
|
||||||
|
JTEST_PF_RESET_XXX(passed, struct_pf_ptr)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of #JTEST_PF_RESET_XXX for the 'failed' member.
|
||||||
|
*/
|
||||||
|
#define JTEST_PF_RESET_FAILED(struct_pf_ptr) \
|
||||||
|
JTEST_PF_RESET_XXX(failed, struct_pf_ptr)
|
||||||
|
|
||||||
|
#endif /* _JTEST_PF_H_ */
|
@ -0,0 +1,94 @@
|
|||||||
|
#ifndef _JTEST_SYSTICK_H_
|
||||||
|
#define _JTEST_SYSTICK_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Get access to the SysTick structure. */
|
||||||
|
#if defined ARMCM0
|
||||||
|
#include "ARMCM0.h"
|
||||||
|
#elif defined ARMCM0P
|
||||||
|
#include "ARMCM0plus.h"
|
||||||
|
#elif defined ARMCM0P_MPU
|
||||||
|
#include "ARMCM0plus_MPU.h"
|
||||||
|
#elif defined ARMCM3
|
||||||
|
#include "ARMCM3.h"
|
||||||
|
#elif defined ARMCM4
|
||||||
|
#include "ARMCM4.h"
|
||||||
|
#elif defined ARMCM4_FP
|
||||||
|
#include "ARMCM4_FP.h"
|
||||||
|
#elif defined ARMCM7
|
||||||
|
#include "ARMCM7.h"
|
||||||
|
#elif defined ARMCM7_SP
|
||||||
|
#include "ARMCM7_SP.h"
|
||||||
|
#elif defined ARMCM7_DP
|
||||||
|
#include "ARMCM7_DP.h"
|
||||||
|
#elif defined ARMSC000
|
||||||
|
#include "ARMSC000.h"
|
||||||
|
#elif defined ARMSC300
|
||||||
|
#include "ARMSC300.h"
|
||||||
|
#elif defined ARMv8MBL
|
||||||
|
#include "ARMv8MBL.h"
|
||||||
|
#elif defined ARMv8MML
|
||||||
|
#include "ARMv8MML.h"
|
||||||
|
#elif defined ARMv8MML_DSP
|
||||||
|
#include "ARMv8MML_DSP.h"
|
||||||
|
#elif defined ARMv8MML_SP
|
||||||
|
#include "ARMv8MML_SP.h"
|
||||||
|
#elif defined ARMv8MML_DSP_SP
|
||||||
|
#include "ARMv8MML_DSP_SP.h"
|
||||||
|
#elif defined ARMv8MML_DP
|
||||||
|
#include "ARMv8MML_DP.h"
|
||||||
|
#elif defined ARMv8MML_DSP_DP
|
||||||
|
#include "ARMv8MML_DSP_DP.h"
|
||||||
|
#elif defined ARMv7A
|
||||||
|
/* TODO */
|
||||||
|
#else
|
||||||
|
#warning "no appropriate header file found!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initial value for the SysTick module.
|
||||||
|
*
|
||||||
|
* This is also the maximum value, important as SysTick is a decrementing counter.
|
||||||
|
*/
|
||||||
|
#define JTEST_SYSTICK_INITIAL_VALUE 0xFFFFFF
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the SysTick, decrementing timer to it's maximum value and disable it.
|
||||||
|
*
|
||||||
|
* This macro should leave the SysTick timer in a state that's ready for cycle
|
||||||
|
* counting.
|
||||||
|
*/
|
||||||
|
#define JTEST_SYSTICK_RESET(systick_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
(systick_ptr)->CTRL = SysTick_CTRL_CLKSOURCE_Msk; \
|
||||||
|
\
|
||||||
|
(systick_ptr)->LOAD = JTEST_SYSTICK_INITIAL_VALUE; \
|
||||||
|
(systick_ptr)->VAL = JTEST_SYSTICK_INITIAL_VALUE; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the SysTick timer, sourced by the processor clock.
|
||||||
|
*/
|
||||||
|
#define JTEST_SYSTICK_START(systick_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
(systick_ptr)->CTRL = \
|
||||||
|
SysTick_CTRL_ENABLE_Msk | \
|
||||||
|
SysTick_CTRL_CLKSOURCE_Msk; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate to the current value of the SysTick timer.
|
||||||
|
*/
|
||||||
|
#define JTEST_SYSTICK_VALUE(systick_ptr) \
|
||||||
|
((systick_ptr)->VAL)
|
||||||
|
|
||||||
|
#endif /* _JTEST_SYSTICK_H_ */
|
@ -0,0 +1,100 @@
|
|||||||
|
#ifndef _JTEST_TEST_H_
|
||||||
|
#define _JTEST_TEST_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "jtest_util.h"
|
||||||
|
#include "jtest_test_ret.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A struct which represents a Test in the JTEST framework. This struct is
|
||||||
|
* used to enable, run, and describe the test it represents.
|
||||||
|
*/
|
||||||
|
typedef struct JTEST_TEST_struct
|
||||||
|
{
|
||||||
|
JTEST_TEST_RET_t ( * test_fn_ptr)(void); /**< Pointer to the test function. */
|
||||||
|
char * test_fn_str; /**< Name of the test function */
|
||||||
|
char * fut_str; /**< Name of the function under test. */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flags that govern how the #JTEST_TEST_t behaves.
|
||||||
|
*/
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
unsigned enabled : 1;
|
||||||
|
unsigned unused : 7;
|
||||||
|
} bits;
|
||||||
|
uint8_t byte; /* Access all flags at once. */
|
||||||
|
} flags;
|
||||||
|
|
||||||
|
} JTEST_TEST_t;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assign a test function to the #JTEST_TEST_t struct.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_SET_FN(jtest_test_ptr, fn_ptr) \
|
||||||
|
JTEST_SET_STRUCT_ATTRIBUTE(jtest_test_ptr, test_fn_ptr, fn_ptr)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specify a function under test (FUT) for the #JTEST_TEST_t struct.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_SET_FUT(jtest_test_ptr, str) \
|
||||||
|
JTEST_SET_STRUCT_ATTRIBUTE(jtest_test_ptr, fut_str, str)
|
||||||
|
|
||||||
|
/* Macros concerning JTEST_TEST_t flags */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define JTEST_TEST_FLAG_SET 1 /**< Value of a set #JTEST_TEST_t flag. */
|
||||||
|
#define JTEST_TEST_FLAG_CLR 0 /**< Value of a cleared #JTEST_TEST_t flag. */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate to the flag in #JTEST_TEST_t having flag_name.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_FLAG(jtest_test_ptr, flag_name) \
|
||||||
|
((jtest_test_ptr)->flags.bits.flag_name)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatch macro for setting and clearing #JTEST_TEST_t flags.
|
||||||
|
*
|
||||||
|
* @param jtest_test_ptr Pointer to a #JTEST_TEST_t struct.
|
||||||
|
* @param flag_name Name of the flag to set in #JTEST_TEST_t.flags.bits
|
||||||
|
* @param xxx Vaid values: "SET" or "CLR"
|
||||||
|
*
|
||||||
|
* @note This function depends on JTEST_TEST_FLAG_SET and JTEST_TEST_FLAG_CLR.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_XXX_FLAG(jtest_test_ptr, flag_name, xxx) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_TEST_FLAG(jtest_test_ptr, flag_name) = JTEST_TEST_FLAG_##xxx ; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specification of #JTEST_TEST_XXX_FLAG to set #JTEST_TEST_t flags.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_SET_FLAG(jtest_test_ptr, flag_name) \
|
||||||
|
JTEST_TEST_XXX_FLAG(jtest_test_ptr, flag_name, SET)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specification of #JTEST_TEST_XXX_FLAG to clear #JTEST_TEST_t flags.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_CLR_FLAG(jtest_test_ptr, flag_name) \
|
||||||
|
JTEST_TEST_XXX_FLAG(jtest_test_ptr, flag_name, CLR)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate to true if the #JTEST_TEST_t is enabled.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_IS_ENABLED(jtest_test_ptr) \
|
||||||
|
(JTEST_TEST_FLAG(jtest_test_ptr, enabled) == JTEST_TEST_FLAG_SET)
|
||||||
|
|
||||||
|
#endif /* _JTEST_TEST_H_ */
|
@ -0,0 +1,121 @@
|
|||||||
|
#ifndef _JTEST_TEST_CALL_H_
|
||||||
|
#define _JTEST_TEST_CALL_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
#include "jtest_test.h"
|
||||||
|
#include "jtest_test_define.h"
|
||||||
|
#include "jtest_fw.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exectute the test in the #JTEST_TEST_t struct associated with the identifier
|
||||||
|
* test_fn and store the result in retval.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_RUN(retval, test_fn) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
JTEST_DUMP_STR("Test Name:\n"); \
|
||||||
|
JTEST_DUMP_STR(JTEST_TEST_STRUCT_NAME(test_fn).test_fn_str); \
|
||||||
|
JTEST_DUMP_STR("Function Under Test:\n"); \
|
||||||
|
JTEST_DUMP_STR(JTEST_TEST_STRUCT_NAME(test_fn).fut_str); \
|
||||||
|
retval = JTEST_TEST_STRUCT_NAME(test_fn).test_fn_ptr(); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the enclosing #JTEST_GROUP_t's pass/fail information based on
|
||||||
|
* test_retval.
|
||||||
|
*
|
||||||
|
* @param test_retval A #JTEST_TEST_RET_enum for the current test.
|
||||||
|
*
|
||||||
|
* @warning Only use if #JTEST_TEST_t is called in the context of a
|
||||||
|
* #JTEST_GROUP_t.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_UPDATE_PARENT_GROUP_PF(test_retval) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
/* Update enclosing JTEST_GROUP_t with pass/fail info */ \
|
||||||
|
if (test_retval == JTEST_TEST_PASSED) \
|
||||||
|
{ \
|
||||||
|
JTEST_GROUP_INC_PASSED(JTEST_CURRENT_GROUP_PTR(), 1); \
|
||||||
|
} else { \
|
||||||
|
JTEST_GROUP_INC_FAILED(JTEST_CURRENT_GROUP_PTR(), 1); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the #JTEST_FW with pass/fail information based on test_retval.
|
||||||
|
*
|
||||||
|
* @param test_retval A #JTEST_TEST_RET_enum for the current test.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_UPDATE_FW_PF(test_retval) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
/* Update the JTEST_FW with pass/fail info */ \
|
||||||
|
if (test_retval == JTEST_TEST_PASSED) \
|
||||||
|
{ \
|
||||||
|
JTEST_FW_INC_PASSED( 1); \
|
||||||
|
} else { \
|
||||||
|
JTEST_FW_INC_FAILED(1); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the enclosing JTEST_GROUP_t's pass/fail information, or the
|
||||||
|
* #JTEST_FW's if this test has no enclosing #JTEST_GROUP_t.
|
||||||
|
*
|
||||||
|
* @param test_retval A #JTEST_TEST_RET_enum for the current test.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_UPDATE_PARENT_GROUP_OR_FW_PF(test_retval) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
/* Update pass-fail information */ \
|
||||||
|
if (JTEST_CURRENT_GROUP_PTR() /* Non-null */) \
|
||||||
|
{ \
|
||||||
|
JTEST_TEST_UPDATE_PARENT_GROUP_PF(test_retval); \
|
||||||
|
} else { \
|
||||||
|
JTEST_TEST_UPDATE_FW_PF(test_retval); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump the results of the test to the Keil Debugger.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_DUMP_RESULTS(test_retval) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
if (test_retval == JTEST_TEST_PASSED) \
|
||||||
|
{ \
|
||||||
|
JTEST_DUMP_STR("Test Passed\n"); \
|
||||||
|
} else { \
|
||||||
|
JTEST_DUMP_STR("Test Failed\n"); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call the #JTEST_TEST_t assocaited with the identifier test_fn.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_CALL(test_fn) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
if (JTEST_TEST_IS_ENABLED(&JTEST_TEST_STRUCT_NAME(test_fn))) \
|
||||||
|
{ \
|
||||||
|
/* Default to failure */ \
|
||||||
|
JTEST_TEST_RET_t __jtest_test_ret = JTEST_TEST_FAILED; \
|
||||||
|
\
|
||||||
|
JTEST_ACT_TEST_START(); \
|
||||||
|
JTEST_TEST_RUN(__jtest_test_ret, test_fn); \
|
||||||
|
\
|
||||||
|
/* Update pass-fail information */ \
|
||||||
|
JTEST_TEST_UPDATE_PARENT_GROUP_OR_FW_PF(__jtest_test_ret); \
|
||||||
|
\
|
||||||
|
JTEST_TEST_DUMP_RESULTS(__jtest_test_ret); \
|
||||||
|
JTEST_ACT_TEST_END(); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* _JTEST_TEST_CALL_H_ */
|
@ -0,0 +1,133 @@
|
|||||||
|
#ifndef _JTEST_TEST_DEFINE_H_
|
||||||
|
#define _JTEST_TEST_DEFINE_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "jtest_util.h"
|
||||||
|
#include "jtest_define.h"
|
||||||
|
#include "jtest_test.h"
|
||||||
|
|
||||||
|
/* For defining macros with optional arguments */
|
||||||
|
#include "opt_arg/opt_arg.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefix for all #JTEST_TEST_t structs.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_STRUCT_NAME_PREFIX G_JTEST_TEST_STRUCT_
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define test template used by #JTEST_TEST_t tests.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_FN_TEMPLATE(test_fn) \
|
||||||
|
JTEST_TEST_RET_t test_fn(void)
|
||||||
|
|
||||||
|
#define JTEST_TEST_FN_PROTOTYPE JTEST_TEST_FN_TEMPLATE /**< Alias for
|
||||||
|
* #JTEST_TEST_FN_TEMPLATE. */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate to the name of the #JTEST_TEST_t struct associated with test_fn.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_STRUCT_NAME(test_fn) \
|
||||||
|
JTEST_STRUCT_NAME(JTEST_TEST_STRUCT_NAME_PREFIX, test_fn)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define a #JTEST_TEST_t struct based on the given test_fn.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_DEFINE_STRUCT(test_fn) \
|
||||||
|
JTEST_DEFINE_STRUCT(JTEST_TEST_t, \
|
||||||
|
JTEST_TEST_STRUCT_NAME(test_fn))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declare a #JTEST_TEST_t struct based on the given test_fn.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_DECLARE_STRUCT(test_fn) \
|
||||||
|
JTEST_DECLARE_STRUCT(JTEST_TEST_DEFINE_STRUCT(test_fn))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contents needed to initialize a JTEST_TEST_t struct.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_STRUCT_INIT(test_fn, fut, enable) \
|
||||||
|
test_fn, \
|
||||||
|
STR_NL(test_fn), \
|
||||||
|
STR_NL(fut), \
|
||||||
|
{ \
|
||||||
|
{ \
|
||||||
|
enable, \
|
||||||
|
0 \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the contents of a #JTEST_TEST_t struct.
|
||||||
|
*/
|
||||||
|
#define JTEST_TEST_INIT(test_fn, fut, enable) \
|
||||||
|
JTEST_TEST_DEFINE_STRUCT(test_fn) = { \
|
||||||
|
JTEST_TEST_STRUCT_INIT(test_fn, fut, enable) \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test Definition Macro */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define a #JTEST_TEST_t object and a test function.
|
||||||
|
*/
|
||||||
|
#define _JTEST_DEFINE_TEST(test_fn, fut, enable) \
|
||||||
|
JTEST_TEST_FN_PROTOTYPE(test_fn); \
|
||||||
|
JTEST_TEST_INIT(test_fn, fut, enable); \
|
||||||
|
JTEST_TEST_FN_PROTOTYPE(test_fn) /* Notice the lacking semicolon */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declare a #JTEST_TEST_t object and a test function prototype.
|
||||||
|
*/
|
||||||
|
#define JTEST_DECLARE_TEST(test_fn) \
|
||||||
|
JTEST_TEST_FN_PROTOTYPE(test_fn); \
|
||||||
|
JTEST_TEST_DECLARE_STRUCT(test_fn) /* Note the lacking semicolon */
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros with optional arguments */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Top-level Interface */
|
||||||
|
#define JTEST_DEFINE_TEST(...) \
|
||||||
|
JTEST_DEFINE_TEST_(PP_NARG(__VA_ARGS__), ##__VA_ARGS__)
|
||||||
|
|
||||||
|
/* Dispatch Macro*/
|
||||||
|
#define JTEST_DEFINE_TEST_(N, ...) \
|
||||||
|
SPLICE(JTEST_DEFINE_TEST_, N)(__VA_ARGS__)
|
||||||
|
|
||||||
|
/* Default Arguments */
|
||||||
|
#define JTEST_DEFINE_TEST_DEFAULT_FUT /* Blank */
|
||||||
|
#define JTEST_DEFINE_TEST_DEFAULT_ENABLE \
|
||||||
|
JTEST_TRUE /* Tests enabled by
|
||||||
|
* default. */
|
||||||
|
|
||||||
|
/* Dispatch Cases*/
|
||||||
|
#define JTEST_DEFINE_TEST_1(_1) \
|
||||||
|
_JTEST_DEFINE_TEST( \
|
||||||
|
_1, \
|
||||||
|
JTEST_DEFINE_TEST_DEFAULT_FUT, \
|
||||||
|
JTEST_DEFINE_TEST_DEFAULT_ENABLE \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define JTEST_DEFINE_TEST_2(_1, _2) \
|
||||||
|
_JTEST_DEFINE_TEST( \
|
||||||
|
_1, \
|
||||||
|
_2, \
|
||||||
|
JTEST_DEFINE_TEST_DEFAULT_ENABLE \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define JTEST_DEFINE_TEST_3(_1, _2, _3) \
|
||||||
|
_JTEST_DEFINE_TEST( \
|
||||||
|
_1, \
|
||||||
|
_2, \
|
||||||
|
_3 \
|
||||||
|
)
|
||||||
|
|
||||||
|
#endif /* _JTEST_TEST_DEFINE_H_ */
|
@ -0,0 +1,17 @@
|
|||||||
|
#ifndef _JTEST_TEST_RET_H_
|
||||||
|
#define _JTEST_TEST_RET_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Values a #JTEST_TEST_t can return.
|
||||||
|
*/
|
||||||
|
typedef enum JTEST_TEST_RET_enum
|
||||||
|
{
|
||||||
|
JTEST_TEST_PASSED,
|
||||||
|
JTEST_TEST_FAILED
|
||||||
|
} JTEST_TEST_RET_t;
|
||||||
|
|
||||||
|
#endif /* _JTEST_TEST_RET_H_ */
|
@ -0,0 +1,27 @@
|
|||||||
|
#ifndef _JTEST_UTIL_H_
|
||||||
|
#define _JTEST_UTIL_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "util/util.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Define boolean values for the framework. */
|
||||||
|
#define JTEST_TRUE 1 /**< Value used for TRUE in JTEST. */
|
||||||
|
#define JTEST_FALSE 0 /**< Value used for FALSE in JTEST. */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the value of the attribute in the struct to by struct_ptr to value.
|
||||||
|
*/
|
||||||
|
#define JTEST_SET_STRUCT_ATTRIBUTE(struct_ptr, attribute, value) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
(struct_ptr)->attribute = (value); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* _JTEST_UTIL_H_ */
|
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef _OPT_ARG_H_
|
||||||
|
#define _OPT_ARG_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "pp_narg.h"
|
||||||
|
#include "splice.h"
|
||||||
|
|
||||||
|
/* If you are Joseph Jaoudi, you have a snippet which expands into an
|
||||||
|
example. If you are not Joseph, but possess his code, study the examples. If
|
||||||
|
you have no examples, turn back contact Joseph. */
|
||||||
|
|
||||||
|
#endif /* _OPT_ARG_H_ */
|
@ -0,0 +1,25 @@
|
|||||||
|
#ifndef _PP_NARG_H_
|
||||||
|
#define _PP_NARG_H_
|
||||||
|
|
||||||
|
#define PP_NARG(...) \
|
||||||
|
PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
|
||||||
|
#define PP_NARG_(...) \
|
||||||
|
PP_ARG_N(__VA_ARGS__)
|
||||||
|
#define PP_ARG_N( \
|
||||||
|
_1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
|
||||||
|
_11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
|
||||||
|
_21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
|
||||||
|
_31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
|
||||||
|
_41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
|
||||||
|
_51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
|
||||||
|
_61,_62,_63,N,...) N
|
||||||
|
#define PP_RSEQ_N() \
|
||||||
|
63,62,61,60, \
|
||||||
|
59,58,57,56,55,54,53,52,51,50, \
|
||||||
|
49,48,47,46,45,44,43,42,41,40, \
|
||||||
|
39,38,37,36,35,34,33,32,31,30, \
|
||||||
|
29,28,27,26,25,24,23,22,21,20, \
|
||||||
|
19,18,17,16,15,14,13,12,11,10, \
|
||||||
|
9,8,7,6,5,4,3,2,1,0
|
||||||
|
|
||||||
|
#endif /* _PP_NARG_H_ */
|
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef _SPLICE_H_
|
||||||
|
#define _SPLICE_H_
|
||||||
|
|
||||||
|
#define SPLICE(a,b) SPLICE_1(a,b)
|
||||||
|
#define SPLICE_1(a,b) SPLICE_2(a,b)
|
||||||
|
#define SPLICE_2(a,b) a##b
|
||||||
|
|
||||||
|
#endif /* _SPLICE_H_ */
|
@ -0,0 +1,52 @@
|
|||||||
|
#ifndef _UTIL_H_
|
||||||
|
#define _UTIL_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a symbol to a string and add a 'NewLine'.
|
||||||
|
*/
|
||||||
|
#define STR_NL(x) STR1_NL(x)
|
||||||
|
#define STR1_NL(x) (STR2_NL(x)"\n")
|
||||||
|
#define STR2_NL(x) #x
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a symbol to a string.
|
||||||
|
*/
|
||||||
|
#define STR(x) STR1(x)
|
||||||
|
#define STR1(x) STR2(x)
|
||||||
|
#define STR2(x) #x
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Concatenate two symbols.
|
||||||
|
*/
|
||||||
|
#define CONCAT(a, b) CONCAT1(a, b)
|
||||||
|
#define CONCAT1(a, b) CONCAT2(a, b)
|
||||||
|
#define CONCAT2(a, b) a##b
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Place curly braces around a varaible number of macro arguments.
|
||||||
|
*/
|
||||||
|
#define CURLY(...) {__VA_ARGS__}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Place parenthesis around a variable number of macro arguments.
|
||||||
|
*/
|
||||||
|
#define PAREN(...) (__VA_ARGS__)
|
||||||
|
|
||||||
|
/* Standard min/max macros. */
|
||||||
|
#define MIN(x,y) (((x) < (y)) ? (x) : (y) )
|
||||||
|
#define MAX(x,y) (((x) > (y)) ? (x) : (y) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bound value using low and high limits.
|
||||||
|
*
|
||||||
|
* Evaluate to a number in the range, endpoint inclusive.
|
||||||
|
*/
|
||||||
|
#define BOUND(low, high, value) \
|
||||||
|
MAX(MIN(high, value), low)
|
||||||
|
|
||||||
|
#endif /* _UTIL_H_ */
|
@ -0,0 +1,9 @@
|
|||||||
|
#include "../inc/jtest_cycle.h"
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Define Module Variables */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* const char * JTEST_CYCLE_STRF = "Running: %s\nCycles: %" PRIu32 "\n"; */
|
||||||
|
const char * JTEST_CYCLE_STRF = "Cycles: %" PRIu32 "\n"; /* function name + parameter string skipped */
|
@ -0,0 +1,36 @@
|
|||||||
|
#include "jtest_fw.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump the JTEST_FW.str_buffer the Keil framework in pieces.
|
||||||
|
*
|
||||||
|
* The JTEST_FW.str_buffer contains more characters than the Keil framework can
|
||||||
|
* dump at once. This function dumps them in blocks.
|
||||||
|
*/
|
||||||
|
void jtest_dump_str_segments(void)
|
||||||
|
{
|
||||||
|
uint32_t seg_idx = 0;
|
||||||
|
uint32_t memmove_idx = 0;
|
||||||
|
uint32_t seg_cnt =
|
||||||
|
(strlen(JTEST_FW.str_buffer) / JTEST_STR_MAX_OUTPUT_SIZE) + 1;
|
||||||
|
|
||||||
|
for( seg_idx = 0; seg_idx < seg_cnt; ++seg_idx)
|
||||||
|
{
|
||||||
|
JTEST_TRIGGER_ACTION(dump_str);
|
||||||
|
|
||||||
|
if (seg_idx < JTEST_STR_MAX_OUTPUT_SEGMENTS)
|
||||||
|
{
|
||||||
|
memmove_idx = 0;
|
||||||
|
while (memmove_idx < (seg_cnt - seg_idx -1) )
|
||||||
|
{
|
||||||
|
memmove(
|
||||||
|
JTEST_FW.str_buffer+
|
||||||
|
(memmove_idx* JTEST_STR_MAX_OUTPUT_SIZE),
|
||||||
|
JTEST_FW.str_buffer+
|
||||||
|
((memmove_idx+1)*JTEST_STR_MAX_OUTPUT_SIZE),
|
||||||
|
JTEST_BUF_SIZE);
|
||||||
|
++memmove_idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
#include "../inc/jtest.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Define Global Variables */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
char JTEST_FW_STR_BUFFER[JTEST_BUF_SIZE] = {0};
|
||||||
|
|
||||||
|
volatile JTEST_FW_t JTEST_FW = {0};
|
@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
#include "jtest_fw.h"
|
||||||
|
|
||||||
|
void test_start (void) {
|
||||||
|
// ;
|
||||||
|
JTEST_FW.test_start++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_end (void) {
|
||||||
|
// ;
|
||||||
|
JTEST_FW.test_end++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void group_start (void) {
|
||||||
|
// ;
|
||||||
|
JTEST_FW.group_start++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void group_end (void) {
|
||||||
|
// ;
|
||||||
|
JTEST_FW.group_end++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_str (void) {
|
||||||
|
// ;
|
||||||
|
JTEST_FW.dump_str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_data (void) {
|
||||||
|
// ;
|
||||||
|
JTEST_FW.dump_data++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void exit_fw (void) {
|
||||||
|
// ;
|
||||||
|
JTEST_FW.exit_fw++;
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef _ALL_TESTS_H_
|
||||||
|
#define _ALL_TESTS_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Test Groups */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
JTEST_DECLARE_GROUP(all_tests);
|
||||||
|
|
||||||
|
#endif /* _ALL_TESTS_H_ */
|
@ -0,0 +1,267 @@
|
|||||||
|
#ifndef _BASIC_MATH_TEMPLATES_H_
|
||||||
|
#define _BASIC_MATH_TEMPLATES_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
#include "test_templates.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Group Specific Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the outputs used by basic math tests for the function under test and
|
||||||
|
* the reference function.
|
||||||
|
*/
|
||||||
|
#define BASIC_MATH_COMPARE_INTERFACE(block_size, output_type) \
|
||||||
|
TEST_ASSERT_BUFFERS_EQUAL( \
|
||||||
|
basic_math_output_ref.data_ptr, \
|
||||||
|
basic_math_output_fut.data_ptr, \
|
||||||
|
block_size * sizeof(output_type))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Comparison SNR thresholds for the data types used in basic_math_tests.
|
||||||
|
*/
|
||||||
|
#define BASIC_MATH_SNR_THRESHOLD_float32_t 120
|
||||||
|
#define BASIC_MATH_SNR_THRESHOLD_q31_t 100
|
||||||
|
#define BASIC_MATH_SNR_THRESHOLD_q15_t 75
|
||||||
|
#define BASIC_MATH_SNR_THRESHOLD_q7_t 25
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare reference and fut outputs using SNR.
|
||||||
|
*
|
||||||
|
* @note The outputs are converted to float32_t before comparison.
|
||||||
|
*/
|
||||||
|
#define BASIC_MATH_SNR_COMPARE_INTERFACE(block_size, output_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEST_CONVERT_AND_ASSERT_SNR( \
|
||||||
|
basic_math_output_f32_ref, \
|
||||||
|
basic_math_output_ref.data_ptr, \
|
||||||
|
basic_math_output_f32_fut, \
|
||||||
|
basic_math_output_fut.data_ptr, \
|
||||||
|
block_size, \
|
||||||
|
output_type, \
|
||||||
|
BASIC_MATH_SNR_THRESHOLD_##output_type \
|
||||||
|
); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare reference and fut outputs using SNR.
|
||||||
|
*
|
||||||
|
* @note The outputs are converted to float32_t before comparison.
|
||||||
|
*/
|
||||||
|
#define BASIC_MATH_SNR_ELT1_COMPARE_INTERFACE(block_size, output_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEST_CONVERT_AND_ASSERT_SNR( \
|
||||||
|
basic_math_output_f32_ref, \
|
||||||
|
basic_math_output_ref.data_ptr, \
|
||||||
|
basic_math_output_f32_fut, \
|
||||||
|
basic_math_output_fut.data_ptr, \
|
||||||
|
1, \
|
||||||
|
output_type, \
|
||||||
|
BASIC_MATH_SNR_THRESHOLD_##output_type \
|
||||||
|
); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Input Interfaces */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/*
|
||||||
|
* General:
|
||||||
|
* Input interfaces provide inputs to functions inside test templates. They
|
||||||
|
* ONLY provide the inputs. The output variables should be hard coded.
|
||||||
|
*
|
||||||
|
* The input interfaces must have the following format:
|
||||||
|
*
|
||||||
|
* ARM_xxx_INPUT_INTERFACE() or
|
||||||
|
* REF_xxx_INPUT_INTERFACE()
|
||||||
|
*
|
||||||
|
* The xxx must be lowercase, and is intended to be the indentifying substring
|
||||||
|
* in the function's name. Acceptable values are 'sub' or 'add' from the
|
||||||
|
* functions arm_add_q31.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ARM_abs_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, basic_math_output_fut.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define REF_abs_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, basic_math_output_ref.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define ARM_add_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, basic_math_output_fut.data_ptr, block_size) \
|
||||||
|
|
||||||
|
#define REF_add_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, basic_math_output_ref.data_ptr, block_size) \
|
||||||
|
|
||||||
|
#define ARM_dot_prod_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, block_size, basic_math_output_fut.data_ptr) \
|
||||||
|
|
||||||
|
#define REF_dot_prod_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, block_size, basic_math_output_ref.data_ptr) \
|
||||||
|
|
||||||
|
#define ARM_mult_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, basic_math_output_fut.data_ptr, block_size) \
|
||||||
|
|
||||||
|
#define REF_mult_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, basic_math_output_ref.data_ptr, block_size) \
|
||||||
|
|
||||||
|
#define ARM_negate_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, basic_math_output_fut.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define REF_negate_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, basic_math_output_ref.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define ARM_offset_INPUT_INTERFACE(input, elt, block_size) \
|
||||||
|
PAREN(input, elt, basic_math_output_fut.data_ptr, block_size) \
|
||||||
|
|
||||||
|
#define REF_offset_INPUT_INTERFACE(input, elt, block_size) \
|
||||||
|
PAREN(input, elt, basic_math_output_ref.data_ptr, block_size) \
|
||||||
|
|
||||||
|
#define ARM_shift_INPUT_INTERFACE(input, elt, block_size) \
|
||||||
|
PAREN(input, elt, basic_math_output_fut.data_ptr, block_size) \
|
||||||
|
|
||||||
|
#define REF_shift_INPUT_INTERFACE(input, elt, block_size) \
|
||||||
|
PAREN(input, elt, basic_math_output_ref.data_ptr, block_size) \
|
||||||
|
|
||||||
|
#define ARM_scale_float_INPUT_INTERFACE(input, elt, block_size) \
|
||||||
|
PAREN(input, elt, basic_math_output_fut.data_ptr, block_size) \
|
||||||
|
|
||||||
|
#define REF_scale_float_INPUT_INTERFACE(input, elt, block_size) \
|
||||||
|
PAREN(input, elt, basic_math_output_ref.data_ptr, block_size) \
|
||||||
|
|
||||||
|
/* These two are for the fixed point functions */
|
||||||
|
#define ARM_scale_INPUT_INTERFACE(input, elt1, elt2, block_size) \
|
||||||
|
PAREN(input, elt1, elt2, basic_math_output_fut.data_ptr, block_size) \
|
||||||
|
|
||||||
|
#define REF_scale_INPUT_INTERFACE(input, elt1, elt2, block_size) \
|
||||||
|
PAREN(input, elt1, elt2, basic_math_output_ref.data_ptr, block_size) \
|
||||||
|
|
||||||
|
#define ARM_sub_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, basic_math_output_fut.data_ptr, block_size) \
|
||||||
|
|
||||||
|
#define REF_sub_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, basic_math_output_ref.data_ptr, block_size) \
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Test Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of #TEST_TEMPLATE_BUF1_BLK() for basic math tests.
|
||||||
|
*
|
||||||
|
* @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
|
||||||
|
* REF_xxx_INPUT_INTERFACEs.
|
||||||
|
*/
|
||||||
|
#define BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK(fn_name, \
|
||||||
|
suffix, \
|
||||||
|
input_type, \
|
||||||
|
output_type) \
|
||||||
|
JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \
|
||||||
|
arm_##fn_name##_##suffix) \
|
||||||
|
{ \
|
||||||
|
TEST_TEMPLATE_BUF1_BLK( \
|
||||||
|
basic_math_f_all, \
|
||||||
|
basic_math_block_sizes, \
|
||||||
|
input_type, \
|
||||||
|
output_type, \
|
||||||
|
arm_##fn_name##_##suffix, \
|
||||||
|
ARM_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
ref_##fn_name##_##suffix, \
|
||||||
|
REF_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
BASIC_MATH_COMPARE_INTERFACE); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of #TEST_TEMPLATE_BUF2_BLK() for basic math tests.
|
||||||
|
*
|
||||||
|
* @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
|
||||||
|
* REF_xxx_INPUT_INTERFACEs.
|
||||||
|
*/
|
||||||
|
#define BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK(fn_name, \
|
||||||
|
suffix, \
|
||||||
|
input_type, \
|
||||||
|
output_type, \
|
||||||
|
comparison_interface) \
|
||||||
|
JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \
|
||||||
|
arm_##fn_name##_##suffix) \
|
||||||
|
{ \
|
||||||
|
TEST_TEMPLATE_BUF2_BLK( \
|
||||||
|
basic_math_f_all, \
|
||||||
|
basic_math_f_all, \
|
||||||
|
basic_math_block_sizes, \
|
||||||
|
input_type, \
|
||||||
|
output_type, \
|
||||||
|
arm_##fn_name##_##suffix, \
|
||||||
|
ARM_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
ref_##fn_name##_##suffix, \
|
||||||
|
REF_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
comparison_interface); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of #TEST_TEMPLATE_BUF1_ELT1_BLK() for basic math tests.
|
||||||
|
*
|
||||||
|
* @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
|
||||||
|
* REF_xxx_INPUT_INTERFACEs.
|
||||||
|
*/
|
||||||
|
#define BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_ELT1_BLK(fn_name, \
|
||||||
|
suffix, \
|
||||||
|
input_type, \
|
||||||
|
elt_type, \
|
||||||
|
output_type) \
|
||||||
|
JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \
|
||||||
|
arm_##fn_name##_##suffix) \
|
||||||
|
{ \
|
||||||
|
TEST_TEMPLATE_BUF1_ELT1_BLK( \
|
||||||
|
basic_math_f_all, \
|
||||||
|
basic_math_elts, \
|
||||||
|
basic_math_block_sizes, \
|
||||||
|
input_type, \
|
||||||
|
elt_type, \
|
||||||
|
output_type, \
|
||||||
|
arm_##fn_name##_##suffix, \
|
||||||
|
ARM_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
ref_##fn_name##_##suffix, \
|
||||||
|
REF_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
BASIC_MATH_COMPARE_INTERFACE); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of #TEST_TEMPLATE_BUF1_ELT2_BLK() for basic math tests.
|
||||||
|
*
|
||||||
|
* @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
|
||||||
|
* REF_xxx_INPUT_INTERFACEs.
|
||||||
|
*/
|
||||||
|
#define BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_ELT2_BLK(fn_name, \
|
||||||
|
suffix, \
|
||||||
|
input_type, \
|
||||||
|
elt1_type, \
|
||||||
|
elt2_type, \
|
||||||
|
output_type) \
|
||||||
|
JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \
|
||||||
|
arm_##fn_name##_##suffix) \
|
||||||
|
{ \
|
||||||
|
TEST_TEMPLATE_BUF1_ELT2_BLK( \
|
||||||
|
basic_math_f_all, \
|
||||||
|
basic_math_elts, \
|
||||||
|
basic_math_elts2, \
|
||||||
|
basic_math_block_sizes, \
|
||||||
|
input_type, \
|
||||||
|
elt1_type, \
|
||||||
|
elt2_type, \
|
||||||
|
output_type, \
|
||||||
|
arm_##fn_name##_##suffix, \
|
||||||
|
ARM_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
ref_##fn_name##_##suffix, \
|
||||||
|
REF_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
BASIC_MATH_COMPARE_INTERFACE); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _BASIC_MATH_TEMPLATES_H_ */
|
@ -0,0 +1,46 @@
|
|||||||
|
#ifndef ARM_BASIC_MATH_TEST_DATA_H
|
||||||
|
#define ARM_BASIC_MATH_TEST_DATA_H
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "arr_desc.h"
|
||||||
|
#include "arm_math.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
#define BASIC_MATH_MAX_INPUT_ELEMENTS 32
|
||||||
|
#define BASIC_MATH_BIGGEST_INPUT_TYPE float32_t
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Variables */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Input/Output Buffers */
|
||||||
|
ARR_DESC_DECLARE(basic_math_output_fut);
|
||||||
|
ARR_DESC_DECLARE(basic_math_output_ref);
|
||||||
|
|
||||||
|
extern BASIC_MATH_BIGGEST_INPUT_TYPE
|
||||||
|
basic_math_output_f32_ref[BASIC_MATH_MAX_INPUT_ELEMENTS];
|
||||||
|
|
||||||
|
extern BASIC_MATH_BIGGEST_INPUT_TYPE
|
||||||
|
basic_math_output_f32_fut[BASIC_MATH_MAX_INPUT_ELEMENTS];
|
||||||
|
|
||||||
|
/* Block Sizes*/
|
||||||
|
ARR_DESC_DECLARE(basic_math_block_sizes);
|
||||||
|
|
||||||
|
/* Numbers */
|
||||||
|
ARR_DESC_DECLARE(basic_math_elts);
|
||||||
|
ARR_DESC_DECLARE(basic_math_elts2);
|
||||||
|
ARR_DESC_DECLARE(basic_math_eltsf);
|
||||||
|
|
||||||
|
/* Float Inputs */
|
||||||
|
ARR_DESC_DECLARE(basic_math_zeros);
|
||||||
|
ARR_DESC_DECLARE(basic_math_f_2);
|
||||||
|
ARR_DESC_DECLARE(basic_math_f_15);
|
||||||
|
ARR_DESC_DECLARE(basic_math_f_32);
|
||||||
|
ARR_DESC_DECLARE(basic_math_f_all);
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef _BASIC_MATH_TEST_GROUP_H_
|
||||||
|
#define _BASIC_MATH_TEST_GROUP_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Test Groups */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
JTEST_DECLARE_GROUP(basic_math_tests);
|
||||||
|
|
||||||
|
#endif /* _BASIC_MATH_TEST_GROUP_H_ */
|
@ -0,0 +1,17 @@
|
|||||||
|
#ifndef _BASIC_MATH_TESTS_H_
|
||||||
|
#define _BASIC_MATH_TESTS_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Test/Group Declarations */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
JTEST_DECLARE_GROUP(abs_tests);
|
||||||
|
JTEST_DECLARE_GROUP(add_tests);
|
||||||
|
JTEST_DECLARE_GROUP(dot_prod_tests);
|
||||||
|
JTEST_DECLARE_GROUP(mult_tests);
|
||||||
|
JTEST_DECLARE_GROUP(negate_tests);
|
||||||
|
JTEST_DECLARE_GROUP(offset_tests);
|
||||||
|
JTEST_DECLARE_GROUP(scale_tests);
|
||||||
|
JTEST_DECLARE_GROUP(shift_tests);
|
||||||
|
JTEST_DECLARE_GROUP(sub_tests);
|
||||||
|
|
||||||
|
#endif /* _BASIC_MATH_TESTS_H_ */
|
@ -0,0 +1,222 @@
|
|||||||
|
#ifndef _COMPLEX_MATH_TEMPLATES_H_
|
||||||
|
#define _COMPLEX_MATH_TEMPLATES_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
#include "test_templates.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Group Specific Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the real outputs from the function under test and the reference
|
||||||
|
* function.
|
||||||
|
*/
|
||||||
|
#define COMPLEX_MATH_COMPARE_RE_INTERFACE(block_size, output_type) \
|
||||||
|
TEST_ASSERT_BUFFERS_EQUAL( \
|
||||||
|
complex_math_output_ref_a.data_ptr, \
|
||||||
|
complex_math_output_fut_a.data_ptr, \
|
||||||
|
block_size * sizeof(output_type))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the real and imaginary outputs from the function under test and the
|
||||||
|
* reference function.
|
||||||
|
*/
|
||||||
|
#define COMPLEX_MATH_COMPARE_CMPLX_INTERFACE(block_size, output_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
COMPLEX_MATH_COMPARE_RE_INTERFACE(block_size * 2, output_type); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Comparison SNR thresholds for the data types used in complex_math_tests.
|
||||||
|
*/
|
||||||
|
#define COMPLEX_MATH_SNR_THRESHOLD_float32_t 120
|
||||||
|
#define COMPLEX_MATH_SNR_THRESHOLD_q31_t 100
|
||||||
|
#define COMPLEX_MATH_SNR_THRESHOLD_q15_t 75
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare reference and fut outputs using SNR.
|
||||||
|
*
|
||||||
|
* The output_suffix specifies which output buffers to use for the
|
||||||
|
* comparison. An output_suffix of 'a' expands to the following buffers:
|
||||||
|
*
|
||||||
|
* - complex_math_output_f32_ref_a
|
||||||
|
* - complex_math_output_f32_fut_a
|
||||||
|
* - complex_math_output_ref_a
|
||||||
|
* - complex_math_output_fut_a
|
||||||
|
*
|
||||||
|
* @note The outputs are converted to float32_t before comparison.
|
||||||
|
*/
|
||||||
|
#define COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size, \
|
||||||
|
output_type, \
|
||||||
|
output_suffix) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEST_CONVERT_AND_ASSERT_SNR( \
|
||||||
|
complex_math_output_f32_ref_##output_suffix, \
|
||||||
|
complex_math_output_ref_##output_suffix.data_ptr, \
|
||||||
|
complex_math_output_f32_fut_##output_suffix, \
|
||||||
|
complex_math_output_fut_##output_suffix.data_ptr, \
|
||||||
|
block_size, \
|
||||||
|
output_type, \
|
||||||
|
COMPLEX_MATH_SNR_THRESHOLD_##output_type \
|
||||||
|
); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specification of #COMPLEX_MATH_SNR_COMPARE_INTERFACE() for real outputs.
|
||||||
|
*/
|
||||||
|
#define COMPLEX_MATH_SNR_COMPARE_RE_INTERFACE(block_size, \
|
||||||
|
output_type) \
|
||||||
|
COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size, \
|
||||||
|
output_type, \
|
||||||
|
a)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specification of #COMPLEX_MATH_SNR_COMPARE_INTERFACE() for complex outputs.
|
||||||
|
*/
|
||||||
|
#define COMPLEX_MATH_SNR_COMPARE_CMPLX_INTERFACE(block_size, \
|
||||||
|
output_type) \
|
||||||
|
COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size * 2, \
|
||||||
|
output_type, \
|
||||||
|
a)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare reference and fut split outputs using SNR.
|
||||||
|
*
|
||||||
|
* 'Split' refers to two separate output buffers; one for real and one for
|
||||||
|
* complex.
|
||||||
|
*/
|
||||||
|
#define COMPLEX_MATH_SNR_COMPARE_SPLIT_INTERFACE(block_size, \
|
||||||
|
output_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size, \
|
||||||
|
output_type, \
|
||||||
|
a); \
|
||||||
|
COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size, \
|
||||||
|
output_type, \
|
||||||
|
b); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Input Interfaces */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/*
|
||||||
|
* General:
|
||||||
|
* Input interfaces provide inputs to functions inside test templates. They
|
||||||
|
* ONLY provide the inputs. The output variables should be hard coded.
|
||||||
|
*
|
||||||
|
* The input interfaces must have the following format:
|
||||||
|
*
|
||||||
|
* ARM_xxx_INPUT_INTERFACE() or
|
||||||
|
* REF_xxx_INPUT_INTERFACE()
|
||||||
|
*
|
||||||
|
* The xxx must be lowercase, and is intended to be the indentifying substring
|
||||||
|
* in the function's name. Acceptable values are 'sub' or 'add' from the
|
||||||
|
* functions arm_add_q31.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ARM_cmplx_conj_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, complex_math_output_fut_a.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define REF_cmplx_conj_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, complex_math_output_ref_a.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define ARM_cmplx_dot_prod_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, block_size, \
|
||||||
|
complex_math_output_fut_a.data_ptr, \
|
||||||
|
complex_math_output_fut_b.data_ptr)
|
||||||
|
|
||||||
|
#define REF_cmplx_dot_prod_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, block_size, \
|
||||||
|
complex_math_output_ref_a.data_ptr, \
|
||||||
|
complex_math_output_ref_b.data_ptr)
|
||||||
|
|
||||||
|
#define ARM_cmplx_mag_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, complex_math_output_fut_a.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define REF_cmplx_mag_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, complex_math_output_ref_a.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define ARM_cmplx_mag_squared_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, complex_math_output_fut_a.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define REF_cmplx_mag_squared_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, complex_math_output_ref_a.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define ARM_cmplx_mult_cmplx_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, complex_math_output_fut_a.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define REF_cmplx_mult_cmplx_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, complex_math_output_ref_a.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define ARM_cmplx_mult_real_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, complex_math_output_fut_a.data_ptr, block_size)
|
||||||
|
|
||||||
|
#define REF_cmplx_mult_real_INPUT_INTERFACE(input_a, input_b, block_size) \
|
||||||
|
PAREN(input_a, input_b, complex_math_output_ref_a.data_ptr, block_size)
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Test Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of #TEST_TEMPLATE_BUF1_BLK() for complex math tests.
|
||||||
|
*
|
||||||
|
* @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
|
||||||
|
* REF_xxx_INPUT_INTERFACEs.
|
||||||
|
*/
|
||||||
|
#define COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK(fn_name, \
|
||||||
|
suffix, \
|
||||||
|
input_type, \
|
||||||
|
output_type, \
|
||||||
|
comparison_interface) \
|
||||||
|
JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \
|
||||||
|
arm_##fn_name##_##suffix) \
|
||||||
|
{ \
|
||||||
|
TEST_TEMPLATE_BUF1_BLK( \
|
||||||
|
complex_math_f_all, \
|
||||||
|
complex_math_block_sizes, \
|
||||||
|
input_type, \
|
||||||
|
output_type, \
|
||||||
|
arm_##fn_name##_##suffix, \
|
||||||
|
ARM_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
ref_##fn_name##_##suffix, \
|
||||||
|
REF_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
comparison_interface); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of #TEST_TEMPLATE_BUF2_BLK1() for complex math tests.
|
||||||
|
*
|
||||||
|
* @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
|
||||||
|
* REF_xxx_INPUT_INTERFACEs.
|
||||||
|
*/
|
||||||
|
#define COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK(fn_name, \
|
||||||
|
suffix, \
|
||||||
|
input_type, \
|
||||||
|
output_type, \
|
||||||
|
comparison_interface) \
|
||||||
|
JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \
|
||||||
|
arm_##fn_name##_##suffix) \
|
||||||
|
{ \
|
||||||
|
TEST_TEMPLATE_BUF2_BLK( \
|
||||||
|
complex_math_f_all, \
|
||||||
|
complex_math_f_all, \
|
||||||
|
complex_math_block_sizes, \
|
||||||
|
input_type, \
|
||||||
|
output_type, \
|
||||||
|
arm_##fn_name##_##suffix, \
|
||||||
|
ARM_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
ref_##fn_name##_##suffix, \
|
||||||
|
REF_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
comparison_interface); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _COMPLEX_MATH_TEMPLATES_H_ */
|
@ -0,0 +1,50 @@
|
|||||||
|
#ifndef _COMPLEX_MATH_TEST_DATA_H_
|
||||||
|
#define _COMPLEX_MATH_TEST_DATA_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "arr_desc.h"
|
||||||
|
#include "arm_math.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
#define COMPLEX_MATH_MAX_INPUT_ELEMENTS 32
|
||||||
|
#define COMPLEX_MATH_BIGGEST_INPUT_TYPE float32_t
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Decalare Variables */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Input/Output Buffers */
|
||||||
|
ARR_DESC_DECLARE(complex_math_output_fut_a);
|
||||||
|
ARR_DESC_DECLARE(complex_math_output_fut_b);
|
||||||
|
ARR_DESC_DECLARE(complex_math_output_ref_a);
|
||||||
|
ARR_DESC_DECLARE(complex_math_output_ref_b);
|
||||||
|
|
||||||
|
extern COMPLEX_MATH_BIGGEST_INPUT_TYPE
|
||||||
|
complex_math_output_f32_ref_a[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2];
|
||||||
|
|
||||||
|
extern COMPLEX_MATH_BIGGEST_INPUT_TYPE
|
||||||
|
complex_math_output_f32_ref_b[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2];
|
||||||
|
|
||||||
|
extern COMPLEX_MATH_BIGGEST_INPUT_TYPE
|
||||||
|
complex_math_output_f32_fut_a[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2];
|
||||||
|
|
||||||
|
extern COMPLEX_MATH_BIGGEST_INPUT_TYPE
|
||||||
|
complex_math_output_f32_fut_b[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2];
|
||||||
|
|
||||||
|
/* Block Sizes*/
|
||||||
|
ARR_DESC_DECLARE(complex_math_block_sizes);
|
||||||
|
|
||||||
|
/* Float Inputs */
|
||||||
|
ARR_DESC_DECLARE(complex_math_zeros);
|
||||||
|
ARR_DESC_DECLARE(complex_math_f_2);
|
||||||
|
ARR_DESC_DECLARE(complex_math_f_15);
|
||||||
|
ARR_DESC_DECLARE(complex_math_f_32);
|
||||||
|
ARR_DESC_DECLARE(complex_math_f_all);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _COMPLEX_MATH_TEST_DATA_H_ */
|
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef _COMPLEX_MATH_TEST_GROUP_H_
|
||||||
|
#define _COMPLEX_MATH_TEST_GROUP_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Test Groups */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
JTEST_DECLARE_GROUP(complex_math_tests);
|
||||||
|
|
||||||
|
#endif /* _COMPLEX_MATH_TEST_GROUP_H_ */
|
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef _COMPLEX_MATH_TESTS_H_
|
||||||
|
#define _COMPLEX_MATH_TESTS_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Test/Group Declarations */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
JTEST_DECLARE_GROUP(cmplx_conj_tests);
|
||||||
|
JTEST_DECLARE_GROUP(cmplx_dot_prod_tests);
|
||||||
|
JTEST_DECLARE_GROUP(cmplx_mag_tests);
|
||||||
|
JTEST_DECLARE_GROUP(cmplx_mag_squared_tests);
|
||||||
|
JTEST_DECLARE_GROUP(cmplx_mult_cmplx_tests);
|
||||||
|
JTEST_DECLARE_GROUP(cmplx_mult_real_tests);
|
||||||
|
|
||||||
|
#endif /* _COMPLEX_MATH_TESTS_H_ */
|
@ -0,0 +1,46 @@
|
|||||||
|
#ifndef _CONTROLLER_TEMPLATES_H_
|
||||||
|
#define _CONTROLLER_TEMPLATES_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "test_templates.h"
|
||||||
|
#include <string.h> /* memcpy() */
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Group Specific Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comparison SNR thresholds for the data types used in transform_tests.
|
||||||
|
*/
|
||||||
|
#define CONTROLLER_SNR_THRESHOLD_float32_t 110
|
||||||
|
#define CONTROLLER_SNR_THRESHOLD_q31_t 100
|
||||||
|
#define CONTROLLER_SNR_THRESHOLD_q15_t 45
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the outputs from the function under test and the reference
|
||||||
|
* function using SNR.
|
||||||
|
*/
|
||||||
|
#define CONTROLLER_SNR_COMPARE_INTERFACE(block_size, \
|
||||||
|
output_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEST_CONVERT_AND_ASSERT_SNR( \
|
||||||
|
controller_output_f32_ref, \
|
||||||
|
(output_type *) controller_output_ref, \
|
||||||
|
controller_output_f32_fut, \
|
||||||
|
(output_type *) controller_output_fut, \
|
||||||
|
block_size, \
|
||||||
|
output_type, \
|
||||||
|
CONTROLLER_SNR_THRESHOLD_##output_type \
|
||||||
|
); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* TEST Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#endif /* _CONTROLLER_TEMPLATES_H_ */
|
@ -0,0 +1,33 @@
|
|||||||
|
#ifndef _CONTROLLER_TEST_DATA_H_
|
||||||
|
#define _CONTROLLER_TEST_DATA_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "arm_math.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define CONTROLLER_MAX_LEN 1024
|
||||||
|
#define CONTROLLER_MAX_COEFFS_LEN (12 * 3)
|
||||||
|
#define TRANFORM_BIGGEST_INPUT_TYPE float32_t
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Variable Declarations */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
extern float32_t controller_output_fut[CONTROLLER_MAX_LEN];
|
||||||
|
extern float32_t controller_output_ref[CONTROLLER_MAX_LEN];
|
||||||
|
extern float32_t controller_output_f32_fut[CONTROLLER_MAX_LEN];
|
||||||
|
extern float32_t controller_output_f32_ref[CONTROLLER_MAX_LEN];
|
||||||
|
extern const float32_t controller_f32_inputs[CONTROLLER_MAX_LEN];
|
||||||
|
extern const q31_t controller_q31_inputs[CONTROLLER_MAX_LEN];
|
||||||
|
extern const q15_t * controller_q15_inputs;
|
||||||
|
extern const float32_t controller_f32_coeffs[CONTROLLER_MAX_COEFFS_LEN];
|
||||||
|
extern const q31_t controller_q31_coeffs[CONTROLLER_MAX_COEFFS_LEN];
|
||||||
|
extern const q15_t controller_q15_coeffs[CONTROLLER_MAX_COEFFS_LEN];
|
||||||
|
|
||||||
|
#endif /* _CONTROLLER_TEST_DATA_H_ */
|
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef _CONTROLLER_TEST_GROUP_H_
|
||||||
|
#define _CONTROLLER_TEST_GROUP_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Test Group */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
JTEST_DECLARE_GROUP(controller_tests);
|
||||||
|
|
||||||
|
#endif /* _CONTROLLER_TEST_GROUP_H_ */
|
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef _CONTROLLER_TESTS_H_
|
||||||
|
#define _CONTROLLER_TESTS_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Test/Group Declarations */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
JTEST_DECLARE_GROUP(pid_reset_tests);
|
||||||
|
JTEST_DECLARE_GROUP(sin_cos_tests);
|
||||||
|
JTEST_DECLARE_GROUP(pid_tests);
|
||||||
|
|
||||||
|
#endif /* _CONTROLLER_TESTS_H_ */
|
@ -0,0 +1,102 @@
|
|||||||
|
#ifndef _FAST_MATH_TEMPLATES_H_
|
||||||
|
#define _FAST_MATH_TEMPLATES_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "test_templates.h"
|
||||||
|
#include <string.h> /* memcpy() */
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Group Specific Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comparison SNR thresholds for the data types used in transform_tests.
|
||||||
|
*/
|
||||||
|
#define FAST_MATH_SNR_THRESHOLD_float32_t 95
|
||||||
|
#define FAST_MATH_SNR_THRESHOLD_q31_t 95
|
||||||
|
#define FAST_MATH_SNR_THRESHOLD_q15_t 45
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the outputs from the function under test and the reference
|
||||||
|
* function using SNR.
|
||||||
|
*/
|
||||||
|
#define FAST_MATH_SNR_COMPARE_INTERFACE(block_size, \
|
||||||
|
output_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEST_CONVERT_AND_ASSERT_SNR( \
|
||||||
|
fast_math_output_f32_ref, \
|
||||||
|
(output_type *) fast_math_output_ref, \
|
||||||
|
fast_math_output_f32_fut, \
|
||||||
|
(output_type *) fast_math_output_fut, \
|
||||||
|
block_size, \
|
||||||
|
output_type, \
|
||||||
|
FAST_MATH_SNR_THRESHOLD_##output_type \
|
||||||
|
); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* TEST Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define SQRT_TEST_TEMPLATE_ELT1(suffix) \
|
||||||
|
\
|
||||||
|
JTEST_DEFINE_TEST(arm_sqrt_##suffix##_test, arm_sqrt_##suffix) \
|
||||||
|
{ \
|
||||||
|
uint32_t i; \
|
||||||
|
\
|
||||||
|
JTEST_COUNT_CYCLES( \
|
||||||
|
for(i=0;i<FAST_MATH_MAX_LEN;i++) \
|
||||||
|
{ \
|
||||||
|
arm_sqrt_##suffix( \
|
||||||
|
(suffix##_t)fast_math_##suffix##_inputs[i] \
|
||||||
|
,(suffix##_t*)fast_math_output_fut + i); \
|
||||||
|
}); \
|
||||||
|
\
|
||||||
|
for(i=0;i<FAST_MATH_MAX_LEN;i++) \
|
||||||
|
{ \
|
||||||
|
ref_sqrt_##suffix( \
|
||||||
|
(suffix##_t)fast_math_##suffix##_inputs[i] \
|
||||||
|
,(suffix##_t*)fast_math_output_ref + i); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
FAST_MATH_SNR_COMPARE_INTERFACE( \
|
||||||
|
FAST_MATH_MAX_LEN, \
|
||||||
|
suffix##_t); \
|
||||||
|
\
|
||||||
|
return JTEST_TEST_PASSED; \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define SIN_COS_TEST_TEMPLATE_ELT1(suffix, type, func) \
|
||||||
|
\
|
||||||
|
JTEST_DEFINE_TEST(arm_##func##_##suffix##_test, arm_##func##_##suffix) \
|
||||||
|
{ \
|
||||||
|
uint32_t i; \
|
||||||
|
\
|
||||||
|
JTEST_COUNT_CYCLES( \
|
||||||
|
for(i=0;i<FAST_MATH_MAX_LEN;i++) \
|
||||||
|
{ \
|
||||||
|
*((type*)fast_math_output_fut + i) = arm_##func##_##suffix( \
|
||||||
|
fast_math_##suffix##_inputs[i]); \
|
||||||
|
}); \
|
||||||
|
\
|
||||||
|
JTEST_COUNT_CYCLES( \
|
||||||
|
for(i=0;i<FAST_MATH_MAX_LEN;i++) \
|
||||||
|
{ \
|
||||||
|
*((type*)fast_math_output_ref + i) = ref_##func##_##suffix( \
|
||||||
|
fast_math_##suffix##_inputs[i]); \
|
||||||
|
}); \
|
||||||
|
\
|
||||||
|
FAST_MATH_SNR_COMPARE_INTERFACE( \
|
||||||
|
FAST_MATH_MAX_LEN, \
|
||||||
|
type); \
|
||||||
|
\
|
||||||
|
return JTEST_TEST_PASSED; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _FAST_MATH_TEMPLATES_H_ */
|
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef _FAST_MATH_TEST_DATA_H_
|
||||||
|
#define _FAST_MATH_TEST_DATA_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "arm_math.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define FAST_MATH_MAX_LEN 1024
|
||||||
|
#define TRANFORM_BIGGEST_INPUT_TYPE float32_t
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Variable Declarations */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
extern float32_t fast_math_output_fut[FAST_MATH_MAX_LEN];
|
||||||
|
extern float32_t fast_math_output_ref[FAST_MATH_MAX_LEN];
|
||||||
|
extern float32_t fast_math_output_f32_fut[FAST_MATH_MAX_LEN];
|
||||||
|
extern float32_t fast_math_output_f32_ref[FAST_MATH_MAX_LEN];
|
||||||
|
extern const float32_t fast_math_f32_inputs[FAST_MATH_MAX_LEN];
|
||||||
|
extern const q31_t fast_math_q31_inputs[FAST_MATH_MAX_LEN];
|
||||||
|
extern const q15_t * fast_math_q15_inputs;
|
||||||
|
|
||||||
|
#endif /* _FAST_MATH_TEST_DATA_H_ */
|
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef _FAST_MATH_TEST_GROUP_H_
|
||||||
|
#define _FAST_MATH_TEST_GROUP_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Test Groups */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
JTEST_DECLARE_GROUP(fast_math_tests);
|
||||||
|
|
||||||
|
#endif /* _FAST_MATH_TEST_GROUP_H_ */
|
@ -0,0 +1,91 @@
|
|||||||
|
#ifndef _FILTERING_TEMPLATES_H_
|
||||||
|
#define _FILTERING_TEMPLATES_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
#include "test_templates.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Group Specific Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Comparison SNR thresholds for the data types used in statistics_tests.
|
||||||
|
*/
|
||||||
|
#define FILTERING_SNR_THRESHOLD_float64_t 120
|
||||||
|
#define FILTERING_SNR_THRESHOLD_float32_t 99
|
||||||
|
#define FILTERING_SNR_THRESHOLD_q31_t 90
|
||||||
|
#define FILTERING_SNR_THRESHOLD_q15_t 60
|
||||||
|
#define FILTERING_SNR_THRESHOLD_q7_t 30
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare reference and fut outputs using SNR.
|
||||||
|
*
|
||||||
|
* @note The outputs are converted to float32_t before comparison.
|
||||||
|
*/
|
||||||
|
#define FILTERING_SNR_COMPARE_INTERFACE(block_size, \
|
||||||
|
output_type) \
|
||||||
|
FILTERING_SNR_COMPARE_INTERFACE_OFFSET(0, block_size, output_type)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare reference and fut outputs starting at some offset using SNR.
|
||||||
|
*/
|
||||||
|
#define FILTERING_SNR_COMPARE_INTERFACE_OFFSET(offset, \
|
||||||
|
block_size, \
|
||||||
|
output_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEST_CONVERT_AND_ASSERT_SNR( \
|
||||||
|
filtering_output_f32_ref, \
|
||||||
|
(output_type *) filtering_output_ref + offset, \
|
||||||
|
filtering_output_f32_fut, \
|
||||||
|
(output_type *) filtering_output_fut + offset, \
|
||||||
|
block_size, \
|
||||||
|
output_type, \
|
||||||
|
FILTERING_SNR_THRESHOLD_##output_type \
|
||||||
|
); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare reference and fut outputs starting at some offset using SNR.
|
||||||
|
* Special case for float64_t
|
||||||
|
*/
|
||||||
|
#define FILTERING_DBL_SNR_COMPARE_INTERFACE(block_size, \
|
||||||
|
output_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEST_ASSERT_DBL_SNR( \
|
||||||
|
(float64_t*)filtering_output_ref, \
|
||||||
|
(float64_t*)filtering_output_fut, \
|
||||||
|
block_size, \
|
||||||
|
FILTERING_SNR_THRESHOLD_##output_type \
|
||||||
|
); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Input Interfaces */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/*
|
||||||
|
* General:
|
||||||
|
* Input interfaces provide inputs to functions inside test templates. They
|
||||||
|
* ONLY provide the inputs. The output variables should be hard coded.
|
||||||
|
*
|
||||||
|
* The input interfaces must have the following format:
|
||||||
|
*
|
||||||
|
* ARM_xxx_INPUT_INTERFACE() or
|
||||||
|
* REF_xxx_INPUT_INTERFACE()
|
||||||
|
*
|
||||||
|
* The xxx must be lowercase, and is intended to be the indentifying substring
|
||||||
|
* in the function's name. Acceptable values are 'sub' or 'add' from the
|
||||||
|
* functions arm_add_q31.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Test Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _FILTERING_TEMPLATES_H_ */
|
@ -0,0 +1,81 @@
|
|||||||
|
#ifndef FILTERING_TEST_DATA_H
|
||||||
|
#define FILTERING_TEST_DATA_H
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "arr_desc.h"
|
||||||
|
#include "arm_math.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define FILTERING_MAX_BLOCKSIZE 33
|
||||||
|
#define LMS_MAX_BLOCKSIZE 512
|
||||||
|
#define FILTERING_MAX_NUMTAPS 34
|
||||||
|
#define FILTERING_MAX_NUMSTAGES 14
|
||||||
|
#define FILTERING_MAX_POSTSHIFT 8
|
||||||
|
#define FILTERING_MAX_TAP_DELAY 0xFF
|
||||||
|
#define FILTERING_MAX_L 3
|
||||||
|
#define FILTERING_MAX_M 33
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Variables */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Input/Output Buffers */
|
||||||
|
extern float32_t filtering_output_fut[LMS_MAX_BLOCKSIZE*2];
|
||||||
|
extern float32_t filtering_output_ref[LMS_MAX_BLOCKSIZE*2];
|
||||||
|
extern float32_t filtering_output_f32_fut[LMS_MAX_BLOCKSIZE*2];
|
||||||
|
extern float32_t filtering_output_f32_ref[LMS_MAX_BLOCKSIZE*2];
|
||||||
|
extern float32_t filtering_input_lms[LMS_MAX_BLOCKSIZE*2];
|
||||||
|
extern float32_t filtering_pState[LMS_MAX_BLOCKSIZE + FILTERING_MAX_NUMTAPS];
|
||||||
|
extern float32_t filtering_scratch[FILTERING_MAX_BLOCKSIZE * 3];
|
||||||
|
extern float32_t filtering_scratch2[FILTERING_MAX_BLOCKSIZE * 3];
|
||||||
|
extern float32_t filtering_coeffs_lms[FILTERING_MAX_NUMTAPS];
|
||||||
|
|
||||||
|
extern const float64_t filtering_f64_inputs[FILTERING_MAX_BLOCKSIZE * FILTERING_MAX_M + FILTERING_MAX_NUMTAPS];
|
||||||
|
extern const float32_t filtering_f32_inputs[FILTERING_MAX_BLOCKSIZE * FILTERING_MAX_M + FILTERING_MAX_NUMTAPS];
|
||||||
|
extern const q31_t filtering_q31_inputs[FILTERING_MAX_BLOCKSIZE * FILTERING_MAX_M + FILTERING_MAX_NUMTAPS];
|
||||||
|
extern const q15_t * filtering_q15_inputs;
|
||||||
|
extern const q7_t * filtering_q7_inputs;
|
||||||
|
|
||||||
|
/* Block Sizes */
|
||||||
|
ARR_DESC_DECLARE(filtering_blocksizes);
|
||||||
|
ARR_DESC_DECLARE(lms_blocksizes);
|
||||||
|
ARR_DESC_DECLARE(filtering_numtaps);
|
||||||
|
ARR_DESC_DECLARE(filtering_numtaps2);
|
||||||
|
ARR_DESC_DECLARE(filtering_postshifts);
|
||||||
|
ARR_DESC_DECLARE(filtering_numstages);
|
||||||
|
ARR_DESC_DECLARE(filtering_Ls);
|
||||||
|
ARR_DESC_DECLARE(filtering_Ms);
|
||||||
|
|
||||||
|
/* Coefficient Lists */
|
||||||
|
extern const float64_t filtering_coeffs_f64[FILTERING_MAX_NUMSTAGES * 6 + 2];
|
||||||
|
extern const float64_t filtering_coeffs_b_f64[FILTERING_MAX_NUMSTAGES * 6 + 2];
|
||||||
|
extern const float32_t filtering_coeffs_f32[FILTERING_MAX_NUMSTAGES * 6 + 2];
|
||||||
|
extern const float32_t filtering_coeffs_b_f32[FILTERING_MAX_NUMSTAGES * 6 + 2];
|
||||||
|
extern const float32_t *filtering_coeffs_c_f32;
|
||||||
|
extern float32_t filtering_coeffs_lms_f32[FILTERING_MAX_NUMTAPS];
|
||||||
|
extern const q31_t filtering_coeffs_q31[FILTERING_MAX_NUMSTAGES * 6 + 2];
|
||||||
|
extern const q31_t *filtering_coeffs_b_q31;
|
||||||
|
extern const q31_t *filtering_coeffs_c_q31;
|
||||||
|
extern q31_t filtering_coeffs_lms_q31[FILTERING_MAX_NUMTAPS];
|
||||||
|
extern const q15_t filtering_coeffs_q15[FILTERING_MAX_NUMSTAGES * 6 + 4];
|
||||||
|
extern const q15_t *filtering_coeffs_b_q15;
|
||||||
|
extern const q15_t *filtering_coeffs_c_q15;
|
||||||
|
extern q15_t filtering_coeffs_lms_q15[FILTERING_MAX_NUMTAPS];
|
||||||
|
extern const q7_t filtering_coeffs_q7[FILTERING_MAX_NUMSTAGES * 6 + 8];
|
||||||
|
extern const q7_t *filtering_coeffs_b_q7;
|
||||||
|
extern const q7_t *filtering_coeffs_c_q7;
|
||||||
|
|
||||||
|
/* Tap Delay Lists */
|
||||||
|
extern const int32_t filtering_tap_delay[FILTERING_MAX_NUMTAPS];
|
||||||
|
|
||||||
|
/* Numbers */
|
||||||
|
|
||||||
|
/* Float Inputs */
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef _FILTERING_TEST_GROUP_H_
|
||||||
|
#define _FILTERING_TEST_GROUP_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Test Groups */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
JTEST_DECLARE_GROUP(filtering_tests);
|
||||||
|
|
||||||
|
#endif /* _FILTERING_TEST_GROUP_H_ */
|
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef _FILTERING_TESTS_H_
|
||||||
|
#define _FILTERING_TESTS_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Test/Group Declarations */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
JTEST_DECLARE_GROUP(biquad_tests);
|
||||||
|
JTEST_DECLARE_GROUP(conv_tests);
|
||||||
|
JTEST_DECLARE_GROUP(correlate_tests);
|
||||||
|
JTEST_DECLARE_GROUP(fir_tests);
|
||||||
|
JTEST_DECLARE_GROUP(iir_tests);
|
||||||
|
JTEST_DECLARE_GROUP(lms_tests);
|
||||||
|
|
||||||
|
#endif /* _FILTERING_TESTS_H_ */
|
@ -0,0 +1,166 @@
|
|||||||
|
#ifndef _INTRINSICS_TEMPLATES_H_
|
||||||
|
#define _INTRINSICS_TEMPLATES_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "test_templates.h"
|
||||||
|
#include <string.h> /* memcpy() */
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Group Specific Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comparison SNR thresholds for the data types used in transform_tests.
|
||||||
|
*/
|
||||||
|
#define INTRINSICS_SNR_THRESHOLD_q63_t 120
|
||||||
|
#define INTRINSICS_SNR_THRESHOLD_q31_t 95
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the outputs from the function under test and the reference
|
||||||
|
* function using SNR.
|
||||||
|
*/
|
||||||
|
#define INTRINSICS_SNR_COMPARE_INTERFACE(block_size, \
|
||||||
|
output_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEST_CONVERT_AND_ASSERT_SNR( \
|
||||||
|
intrinsics_output_f32_ref, \
|
||||||
|
(output_type##_t *) intrinsics_output_ref, \
|
||||||
|
intrinsics_output_f32_fut, \
|
||||||
|
(output_type##_t *) intrinsics_output_fut, \
|
||||||
|
block_size, \
|
||||||
|
output_type, \
|
||||||
|
INTRINSICS_SNR_THRESHOLD_##output_type##_t \
|
||||||
|
); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* TEST Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define INTRINSICS_TEST_TEMPLATE_ELT1(functionName, dataType) \
|
||||||
|
\
|
||||||
|
JTEST_DEFINE_TEST(functionName##_test, functionName) \
|
||||||
|
{ \
|
||||||
|
uint32_t i; \
|
||||||
|
\
|
||||||
|
JTEST_COUNT_CYCLES( \
|
||||||
|
for(i=0;i<INTRINSICS_MAX_LEN;i++) \
|
||||||
|
{ \
|
||||||
|
*((dataType##_t*)intrinsics_output_fut + i) = \
|
||||||
|
functionName( \
|
||||||
|
(dataType##_t)intrinsics_##dataType##_inputs[i]); \
|
||||||
|
}); \
|
||||||
|
\
|
||||||
|
for(i=0;i<INTRINSICS_MAX_LEN;i++) \
|
||||||
|
{ \
|
||||||
|
*((dataType##_t*)intrinsics_output_ref + i) = \
|
||||||
|
ref##functionName( \
|
||||||
|
(dataType##_t)intrinsics_##dataType##_inputs[i]); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
INTRINSICS_SNR_COMPARE_INTERFACE( \
|
||||||
|
INTRINSICS_MAX_LEN, \
|
||||||
|
dataType); \
|
||||||
|
\
|
||||||
|
return JTEST_TEST_PASSED; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define INTRINSICS_TEST_TEMPLATE_ELT2(functionName, dataType) \
|
||||||
|
\
|
||||||
|
JTEST_DEFINE_TEST(functionName##_test, functionName) \
|
||||||
|
{ \
|
||||||
|
uint32_t i; \
|
||||||
|
\
|
||||||
|
JTEST_COUNT_CYCLES( \
|
||||||
|
for(i=0;i<INTRINSICS_MAX_LEN;i++) \
|
||||||
|
{ \
|
||||||
|
*((dataType##_t*)intrinsics_output_fut + i) = \
|
||||||
|
functionName( \
|
||||||
|
(dataType##_t)intrinsics_##dataType##_inputs[i] \
|
||||||
|
,(dataType##_t)intrinsics_##dataType##_inputs[i]); \
|
||||||
|
}); \
|
||||||
|
\
|
||||||
|
for(i=0;i<INTRINSICS_MAX_LEN;i++) \
|
||||||
|
{ \
|
||||||
|
*((dataType##_t*)intrinsics_output_ref + i) = \
|
||||||
|
ref##functionName( \
|
||||||
|
(dataType##_t)intrinsics_##dataType##_inputs[i] \
|
||||||
|
,(dataType##_t)intrinsics_##dataType##_inputs[i]); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
INTRINSICS_SNR_COMPARE_INTERFACE( \
|
||||||
|
INTRINSICS_MAX_LEN, \
|
||||||
|
dataType); \
|
||||||
|
\
|
||||||
|
return JTEST_TEST_PASSED; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define INTRINSICS_TEST_TEMPLATE_ELT3(functionName, dataType) \
|
||||||
|
\
|
||||||
|
JTEST_DEFINE_TEST(functionName##_test, functionName) \
|
||||||
|
{ \
|
||||||
|
uint32_t i; \
|
||||||
|
\
|
||||||
|
JTEST_COUNT_CYCLES( \
|
||||||
|
for(i=0;i<INTRINSICS_MAX_LEN;i++) \
|
||||||
|
{ \
|
||||||
|
*((dataType##_t*)intrinsics_output_fut + i) = \
|
||||||
|
functionName( \
|
||||||
|
(dataType##_t)intrinsics_##dataType##_inputs[i] \
|
||||||
|
,(dataType##_t)intrinsics_##dataType##_inputs[i] \
|
||||||
|
,(dataType##_t)intrinsics_##dataType##_inputs[i]); \
|
||||||
|
}); \
|
||||||
|
\
|
||||||
|
for(i=0;i<INTRINSICS_MAX_LEN;i++) \
|
||||||
|
{ \
|
||||||
|
*((dataType##_t*)intrinsics_output_ref + i) = \
|
||||||
|
ref##functionName( \
|
||||||
|
(dataType##_t)intrinsics_##dataType##_inputs[i] \
|
||||||
|
,(dataType##_t)intrinsics_##dataType##_inputs[i] \
|
||||||
|
,(dataType##_t)intrinsics_##dataType##_inputs[i]); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
INTRINSICS_SNR_COMPARE_INTERFACE( \
|
||||||
|
INTRINSICS_MAX_LEN, \
|
||||||
|
dataType); \
|
||||||
|
\
|
||||||
|
return JTEST_TEST_PASSED; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define INTRINSICS_TEST_TEMPLATE_ELT4(functionName, dataType, dataType2) \
|
||||||
|
JTEST_DEFINE_TEST(functionName##_test, functionName) \
|
||||||
|
{ \
|
||||||
|
uint32_t i; \
|
||||||
|
\
|
||||||
|
JTEST_COUNT_CYCLES( \
|
||||||
|
for(i=0;i<INTRINSICS_MAX_LEN;i++) \
|
||||||
|
{ \
|
||||||
|
*((dataType2##_t*)intrinsics_output_fut + i) = \
|
||||||
|
functionName( \
|
||||||
|
(dataType##_t)intrinsics_##dataType##_inputs[i] \
|
||||||
|
,(dataType##_t)intrinsics_##dataType##_inputs[i] \
|
||||||
|
,(dataType2##_t)intrinsics_##dataType2##_inputs[i]); \
|
||||||
|
}); \
|
||||||
|
\
|
||||||
|
for(i=0;i<INTRINSICS_MAX_LEN;i++) \
|
||||||
|
{ \
|
||||||
|
*((dataType2##_t*)intrinsics_output_ref + i) = \
|
||||||
|
ref##functionName( \
|
||||||
|
(dataType##_t)intrinsics_##dataType##_inputs[i] \
|
||||||
|
,(dataType##_t)intrinsics_##dataType##_inputs[i] \
|
||||||
|
,(dataType2##_t)intrinsics_##dataType2##_inputs[i]); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
INTRINSICS_SNR_COMPARE_INTERFACE( \
|
||||||
|
INTRINSICS_MAX_LEN, \
|
||||||
|
dataType2); \
|
||||||
|
\
|
||||||
|
return JTEST_TEST_PASSED; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _INTRINSICS_TEMPLATES_H_ */
|
@ -0,0 +1,27 @@
|
|||||||
|
#ifndef _INTRINSICS_TEST_DATA_H_
|
||||||
|
#define _INTRINSICS_TEST_DATA_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "arm_math.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define INTRINSICS_MAX_LEN 1024
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Variable Declarations */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
extern q63_t intrinsics_output_fut[INTRINSICS_MAX_LEN];
|
||||||
|
extern q63_t intrinsics_output_ref[INTRINSICS_MAX_LEN];
|
||||||
|
extern float32_t intrinsics_output_f32_fut[INTRINSICS_MAX_LEN];
|
||||||
|
extern float32_t intrinsics_output_f32_ref[INTRINSICS_MAX_LEN];
|
||||||
|
extern const q63_t intrinsics_q63_inputs[INTRINSICS_MAX_LEN];
|
||||||
|
extern const q31_t *intrinsics_q31_inputs;
|
||||||
|
|
||||||
|
#endif /* _INTRINSICS_TEST_DATA_H_ */
|
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef _INTRINSICS_TEST_GROUP_H_
|
||||||
|
#define _INTRINSICS_TEST_GROUP_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Test Groups */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
JTEST_DECLARE_GROUP(intrinsics_tests);
|
||||||
|
|
||||||
|
#endif /* _INTRINSICS_TEST_GROUP_H_ */
|
@ -0,0 +1,52 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* $Date: 29. November 2010
|
||||||
|
* $Revision: V1.0.3
|
||||||
|
*
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
*
|
||||||
|
* Title: math_helper.h
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Description: Prototypes of all helper functions required.
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M4/Cortex-M3
|
||||||
|
*
|
||||||
|
* Version 1.0.3 2010/11/29
|
||||||
|
* Re-organized the CMSIS folders and updated documentation.
|
||||||
|
*
|
||||||
|
* Version 1.0.2 2010/11/11
|
||||||
|
* Documentation updated.
|
||||||
|
*
|
||||||
|
* Version 1.0.1 2010/10/05
|
||||||
|
* Production release and review comments incorporated.
|
||||||
|
*
|
||||||
|
* Version 1.0.0 2010/09/20
|
||||||
|
* Production release and review comments incorporated.
|
||||||
|
*
|
||||||
|
* Version 0.0.7 2010/06/10
|
||||||
|
* Misra-C changes done
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifndef MATH_HELPER_H
|
||||||
|
#define MATH_HELPER_H
|
||||||
|
|
||||||
|
#include "arm_math.h"
|
||||||
|
|
||||||
|
float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize);
|
||||||
|
double arm_snr_f64(double *pRef, double *pTest, uint32_t buffSize);
|
||||||
|
void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples);
|
||||||
|
void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits);
|
||||||
|
void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits);
|
||||||
|
void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples);
|
||||||
|
void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples);
|
||||||
|
void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples);
|
||||||
|
void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples);
|
||||||
|
void arm_clip_f32(float *pIn, uint32_t numSamples);
|
||||||
|
uint32_t arm_calc_guard_bits(uint32_t num_adds);
|
||||||
|
void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits);
|
||||||
|
uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples);
|
||||||
|
uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples);
|
||||||
|
uint32_t arm_calc_2pow(uint32_t guard_bits);
|
||||||
|
#endif
|
@ -0,0 +1,370 @@
|
|||||||
|
#ifndef _MATRIX_TEMPLATES_H_
|
||||||
|
#define _MATRIX_TEMPLATES_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
#include "test_templates.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Group Specific Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the outputs from the function under test and the reference
|
||||||
|
* function.
|
||||||
|
*/
|
||||||
|
#define MATRIX_COMPARE_INTERFACE(output_type, output_content_type) \
|
||||||
|
TEST_ASSERT_BUFFERS_EQUAL( \
|
||||||
|
((output_type *) &matrix_output_ref)->pData, \
|
||||||
|
((output_type *) &matrix_output_fut)->pData, \
|
||||||
|
((output_type *) &matrix_output_fut)->numRows * \
|
||||||
|
((output_type *) &matrix_output_ref)->numCols * \
|
||||||
|
sizeof(output_content_type))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comparison SNR thresholds for the data types used in matrix_tests.
|
||||||
|
*/
|
||||||
|
#define MATRIX_SNR_THRESHOLD 120
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the outputs from the function under test and the reference
|
||||||
|
* function using SNR.
|
||||||
|
*/
|
||||||
|
#define MATRIX_SNR_COMPARE_INTERFACE(output_type, output_content_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEST_CONVERT_AND_ASSERT_SNR( \
|
||||||
|
(float32_t *)matrix_output_f32_ref, \
|
||||||
|
((output_type *) &matrix_output_ref)->pData, \
|
||||||
|
(float32_t *)matrix_output_f32_fut, \
|
||||||
|
((output_type *) &matrix_output_ref)->pData, \
|
||||||
|
((output_type *) &matrix_output_fut)->numRows * \
|
||||||
|
((output_type *) &matrix_output_ref)->numCols, \
|
||||||
|
output_content_type, \
|
||||||
|
MATRIX_SNR_THRESHOLD \
|
||||||
|
); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the outputs from the function under test and the reference
|
||||||
|
* function using SNR. This is special for float64_t
|
||||||
|
*/
|
||||||
|
#define MATRIX_DBL_SNR_COMPARE_INTERFACE(output_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEST_ASSERT_DBL_SNR( \
|
||||||
|
(float64_t *)matrix_output_f32_ref, \
|
||||||
|
(float64_t *)matrix_output_f32_fut, \
|
||||||
|
((output_type *) &matrix_output_fut)->numRows * \
|
||||||
|
((output_type *) &matrix_output_ref)->numCols, \
|
||||||
|
MATRIX_SNR_THRESHOLD \
|
||||||
|
); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Input Interfaces */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/*
|
||||||
|
* General:
|
||||||
|
* Input interfaces provide inputs to functions inside test templates. They
|
||||||
|
* ONLY provide the inputs. The output variables should be hard coded.
|
||||||
|
*
|
||||||
|
* The input interfaces must have the following format:
|
||||||
|
*
|
||||||
|
* ARM_xxx_INPUT_INTERFACE() or
|
||||||
|
* REF_xxx_INPUT_INTERFACE()
|
||||||
|
*
|
||||||
|
* The xxx must be lowercase, and is intended to be the indentifying substring
|
||||||
|
* in the function's name. Acceptable values are 'sub' or 'add' from the
|
||||||
|
* functions arm_add_q31.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ARM_mat_add_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \
|
||||||
|
PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut)
|
||||||
|
|
||||||
|
#define REF_mat_add_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \
|
||||||
|
PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref)
|
||||||
|
|
||||||
|
#define ARM_mat_cmplx_mult_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \
|
||||||
|
PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut)
|
||||||
|
|
||||||
|
#define REF_mat_cmplx_mult_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \
|
||||||
|
PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref)
|
||||||
|
|
||||||
|
#define ARM_mat_inverse_INPUT_INTERFACE(input_ptr) \
|
||||||
|
PAREN(input_ptr, (void *) &matrix_output_fut)
|
||||||
|
|
||||||
|
#define REF_mat_inverse_INPUT_INTERFACE(input_ptr) \
|
||||||
|
PAREN(input_ptr, (void *) &matrix_output_ref)
|
||||||
|
|
||||||
|
#define ARM_mat_mult_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \
|
||||||
|
PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut)
|
||||||
|
|
||||||
|
#define REF_mat_mult_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \
|
||||||
|
PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref)
|
||||||
|
|
||||||
|
#define ARM_mat_mult_fast_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \
|
||||||
|
PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut)
|
||||||
|
|
||||||
|
#define REF_mat_mult_fast_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \
|
||||||
|
PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref)
|
||||||
|
|
||||||
|
#define ARM_mat_sub_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \
|
||||||
|
PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut)
|
||||||
|
|
||||||
|
#define REF_mat_sub_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \
|
||||||
|
PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref)
|
||||||
|
|
||||||
|
#define ARM_mat_trans_INPUT_INTERFACE(input_ptr) \
|
||||||
|
PAREN(input_ptr, (void *) &matrix_output_fut)
|
||||||
|
|
||||||
|
#define REF_mat_trans_INPUT_INTERFACE(input_ptr) \
|
||||||
|
PAREN(input_ptr, (void *) &matrix_output_ref)
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Dimension Validation Interfaces */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define MATRIX_TEST_VALID_ADDITIVE_DIMENSIONS(input_type, \
|
||||||
|
matrix_a_ptr, \
|
||||||
|
matrix_b_ptr) \
|
||||||
|
((((input_type) (matrix_a_ptr))->numRows == \
|
||||||
|
((input_type) (matrix_b_ptr))->numRows) && \
|
||||||
|
(((input_type) (matrix_a_ptr))->numCols == \
|
||||||
|
((input_type) (matrix_b_ptr))->numCols))
|
||||||
|
|
||||||
|
#define MATRIX_TEST_VALID_MULTIPLICATIVE_DIMENSIONS(input_type, \
|
||||||
|
matrix_a_ptr, \
|
||||||
|
matrix_b_ptr) \
|
||||||
|
(((input_type) (matrix_a_ptr))->numCols == \
|
||||||
|
((input_type) (matrix_b_ptr))->numRows)
|
||||||
|
|
||||||
|
#define MATRIX_TEST_VALID_SQUARE_DIMENSIONS(input_type, \
|
||||||
|
matrix_ptr) \
|
||||||
|
(((input_type)(matrix_ptr))->numRows == \
|
||||||
|
((input_type)(matrix_ptr))->numCols)
|
||||||
|
|
||||||
|
#define MATRIX_TEST_VALID_DIMENSIONS_ALWAYS(input_type, \
|
||||||
|
matrix_ptr) \
|
||||||
|
(1 == 1) \
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Output Configuration Interfaces */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* The matrix tests assume the output matrix is always the correct size. These
|
||||||
|
* interfaces size the properly size the output matrices according to the input
|
||||||
|
* matrices and the operation at hand.*/
|
||||||
|
|
||||||
|
#define MATRIX_TEST_CONFIG_ADDITIVE_OUTPUT(input_type, \
|
||||||
|
matrix_a_ptr, \
|
||||||
|
matrix_b_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
((input_type) &matrix_output_fut)->numRows = \
|
||||||
|
((input_type)(matrix_a_ptr))->numRows; \
|
||||||
|
((input_type) &matrix_output_fut)->numCols = \
|
||||||
|
((input_type)(matrix_a_ptr))->numCols; \
|
||||||
|
((input_type) &matrix_output_ref)->numRows = \
|
||||||
|
((input_type)(matrix_a_ptr))->numRows; \
|
||||||
|
((input_type) &matrix_output_ref)->numCols = \
|
||||||
|
((input_type)(matrix_a_ptr))->numCols; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define MATRIX_TEST_CONFIG_MULTIPLICATIVE_OUTPUT(input_type, \
|
||||||
|
matrix_a_ptr, \
|
||||||
|
matrix_b_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
((input_type) &matrix_output_fut)->numRows = \
|
||||||
|
((input_type)(matrix_a_ptr))->numRows; \
|
||||||
|
((input_type) &matrix_output_fut)->numCols = \
|
||||||
|
((input_type)(matrix_b_ptr))->numCols; \
|
||||||
|
((input_type) &matrix_output_ref)->numRows = \
|
||||||
|
((input_type)(matrix_a_ptr))->numRows; \
|
||||||
|
((input_type) &matrix_output_ref)->numCols = \
|
||||||
|
((input_type)(matrix_b_ptr))->numCols; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define MATRIX_TEST_CONFIG_SAMESIZE_OUTPUT(input_type, \
|
||||||
|
matrix_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
((input_type) &matrix_output_fut)->numRows = \
|
||||||
|
((input_type)(matrix_ptr))->numRows; \
|
||||||
|
((input_type) &matrix_output_fut)->numCols = \
|
||||||
|
((input_type)(matrix_ptr))->numCols; \
|
||||||
|
((input_type) &matrix_output_ref)->numRows = \
|
||||||
|
((input_type)(matrix_ptr))->numRows; \
|
||||||
|
((input_type) &matrix_output_ref)->numCols = \
|
||||||
|
((input_type)(matrix_ptr))->numCols; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define MATRIX_TEST_CONFIG_TRANSPOSE_OUTPUT(input_type, \
|
||||||
|
matrix_ptr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
((input_type) &matrix_output_fut)->numRows = \
|
||||||
|
((input_type)(matrix_ptr))->numCols; \
|
||||||
|
((input_type) &matrix_output_fut)->numCols = \
|
||||||
|
((input_type)(matrix_ptr))->numRows; \
|
||||||
|
((input_type) &matrix_output_ref)->numRows = \
|
||||||
|
((input_type)(matrix_ptr))->numCols; \
|
||||||
|
((input_type) &matrix_output_ref)->numCols = \
|
||||||
|
((input_type)(matrix_ptr))->numRows; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* TEST Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define MATRIX_TEST_TEMPLATE_ELT1(arr_desc_inputs, \
|
||||||
|
input_type, \
|
||||||
|
output_type, output_content_type, \
|
||||||
|
fut, fut_arg_interface, \
|
||||||
|
ref, ref_arg_interface, \
|
||||||
|
output_config_interface, \
|
||||||
|
dim_validation_interface, \
|
||||||
|
compare_interface) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEMPLATE_DO_ARR_DESC( \
|
||||||
|
input_idx, input_type, input, arr_desc_inputs \
|
||||||
|
, \
|
||||||
|
JTEST_DUMP_STRF("Matrix Dimensions: %dx%d\n", \
|
||||||
|
(int)input->numRows, \
|
||||||
|
(int)input->numCols); \
|
||||||
|
\
|
||||||
|
if (dim_validation_interface(input_type, \
|
||||||
|
input)) { \
|
||||||
|
output_config_interface(input_type, \
|
||||||
|
input); \
|
||||||
|
TEST_CALL_FUT_AND_REF( \
|
||||||
|
fut, fut_arg_interface(input), \
|
||||||
|
ref, ref_arg_interface(input)); \
|
||||||
|
compare_interface(output_type, \
|
||||||
|
output_content_type); \
|
||||||
|
} else { \
|
||||||
|
arm_status matrix_test_retval; \
|
||||||
|
TEST_CALL_FUT( \
|
||||||
|
matrix_test_retval = fut, \
|
||||||
|
fut_arg_interface(input)); \
|
||||||
|
\
|
||||||
|
/* If dimensions are known bad, the fut should */ \
|
||||||
|
/* detect it. */ \
|
||||||
|
if ( matrix_test_retval != ARM_MATH_SIZE_MISMATCH) { \
|
||||||
|
return JTEST_TEST_FAILED; \
|
||||||
|
} \
|
||||||
|
}); \
|
||||||
|
return JTEST_TEST_PASSED; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#define MATRIX_TEST_TEMPLATE_ELT2(arr_desc_inputs_a, \
|
||||||
|
arr_desc_inputs_b, \
|
||||||
|
input_type, \
|
||||||
|
output_type, output_content_type, \
|
||||||
|
fut, fut_arg_interface, \
|
||||||
|
ref, ref_arg_interface, \
|
||||||
|
output_config_interface, \
|
||||||
|
dim_validation_interface, \
|
||||||
|
compare_interface) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEMPLATE_DO_ARR_DESC( \
|
||||||
|
input_a_idx, input_type, input_a, arr_desc_inputs_a \
|
||||||
|
, \
|
||||||
|
input_type input_b = ARR_DESC_ELT( \
|
||||||
|
input_type, input_a_idx, \
|
||||||
|
&(arr_desc_inputs_b)); \
|
||||||
|
\
|
||||||
|
JTEST_DUMP_STRF("Matrix Dimensions: A %dx%d B %dx%d\n", \
|
||||||
|
(int)input_a->numRows, \
|
||||||
|
(int)input_a->numCols, \
|
||||||
|
(int)input_b->numRows, \
|
||||||
|
(int)input_b->numCols); \
|
||||||
|
\
|
||||||
|
if (dim_validation_interface(input_type, \
|
||||||
|
input_a, \
|
||||||
|
input_b)) { \
|
||||||
|
\
|
||||||
|
output_config_interface(input_type, \
|
||||||
|
input_a, \
|
||||||
|
input_b); \
|
||||||
|
\
|
||||||
|
TEST_CALL_FUT_AND_REF( \
|
||||||
|
fut, fut_arg_interface(input_a, input_b), \
|
||||||
|
ref, ref_arg_interface(input_a, input_b)); \
|
||||||
|
\
|
||||||
|
compare_interface(output_type, output_content_type); \
|
||||||
|
\
|
||||||
|
} else { \
|
||||||
|
arm_status matrix_test_retval; \
|
||||||
|
TEST_CALL_FUT( \
|
||||||
|
matrix_test_retval = fut, fut_arg_interface(input_a, input_b)); \
|
||||||
|
\
|
||||||
|
/* If dimensions are known bad, the fut should */ \
|
||||||
|
/* detect it. */ \
|
||||||
|
if ( matrix_test_retval != ARM_MATH_SIZE_MISMATCH) { \
|
||||||
|
return JTEST_TEST_FAILED; \
|
||||||
|
} \
|
||||||
|
}); \
|
||||||
|
return JTEST_TEST_PASSED; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of #MATRIX_TEST_TEMPLATE_ELT2() for matrix tests.
|
||||||
|
*
|
||||||
|
* @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
|
||||||
|
* REF_xxx_INPUT_INTERFACEs.
|
||||||
|
*/
|
||||||
|
#define MATRIX_DEFINE_TEST_TEMPLATE_ELT2(fn_name, suffix, \
|
||||||
|
output_config_interface, \
|
||||||
|
dim_validation_interface, \
|
||||||
|
comparison_interface) \
|
||||||
|
JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \
|
||||||
|
arm_##fn_name##_##suffix) \
|
||||||
|
{ \
|
||||||
|
MATRIX_TEST_TEMPLATE_ELT2( \
|
||||||
|
matrix_##suffix##_a_inputs, \
|
||||||
|
matrix_##suffix##_b_inputs, \
|
||||||
|
arm_matrix_instance_##suffix * , \
|
||||||
|
arm_matrix_instance_##suffix, \
|
||||||
|
TYPE_FROM_ABBREV(suffix), \
|
||||||
|
arm_##fn_name##_##suffix, \
|
||||||
|
ARM_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
ref_##fn_name##_##suffix, \
|
||||||
|
REF_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
output_config_interface, \
|
||||||
|
dim_validation_interface, \
|
||||||
|
comparison_interface); \
|
||||||
|
} \
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of #MATRIX_TEST_TEMPLATE_ELT1() for matrix tests.
|
||||||
|
*
|
||||||
|
* @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
|
||||||
|
* REF_xxx_INPUT_INTERFACEs.
|
||||||
|
*/
|
||||||
|
#define MATRIX_DEFINE_TEST_TEMPLATE_ELT1(fn_name, suffix, \
|
||||||
|
output_config_interface, \
|
||||||
|
dim_validation_interface) \
|
||||||
|
JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \
|
||||||
|
arm_##fn_name##_##suffix) \
|
||||||
|
{ \
|
||||||
|
MATRIX_TEST_TEMPLATE_ELT1( \
|
||||||
|
matrix_##suffix##_a_inputs, \
|
||||||
|
arm_matrix_instance_##suffix * , \
|
||||||
|
arm_matrix_instance_##suffix, \
|
||||||
|
TYPE_FROM_ABBREV(suffix), \
|
||||||
|
arm_##fn_name##_##suffix, \
|
||||||
|
ARM_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
ref_##fn_name##_##suffix, \
|
||||||
|
REF_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
output_config_interface, \
|
||||||
|
dim_validation_interface, \
|
||||||
|
MATRIX_COMPARE_INTERFACE); \
|
||||||
|
} \
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _MATRIX_TEMPLATES_H_ */
|
@ -0,0 +1,54 @@
|
|||||||
|
#ifndef _MATRIX_TEST_DATA_H_
|
||||||
|
#define _MATRIX_TEST_DATA_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "arr_desc.h"
|
||||||
|
#include "arm_math.h" /* float32_t */
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Macros and Defines */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
#define MATRIX_TEST_MAX_ROWS 4
|
||||||
|
#define MATRIX_TEST_MAX_COLS 4
|
||||||
|
#define MATRIX_TEST_BIGGEST_INPUT_TYPE float64_t
|
||||||
|
#define MATRIX_TEST_MAX_ELTS (MATRIX_TEST_MAX_ROWS * MATRIX_TEST_MAX_COLS)
|
||||||
|
#define MATRIX_MAX_COEFFS_LEN 16
|
||||||
|
#define MATRIX_MAX_SHIFTS_LEN 5
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declare the matrix inputs defined by MATRIX_DEFINE_INPUTS.
|
||||||
|
*/
|
||||||
|
#define MATRIX_DECLARE_INPUTS(suffix) \
|
||||||
|
ARR_DESC_DECLARE(matrix_##suffix##_a_inputs); \
|
||||||
|
ARR_DESC_DECLARE(matrix_##suffix##_b_inputs); \
|
||||||
|
ARR_DESC_DECLARE(matrix_##suffix##_invertible_inputs)
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Variables */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Input/Output Buffers */
|
||||||
|
extern arm_matrix_instance_f32 matrix_output_fut;
|
||||||
|
extern arm_matrix_instance_f32 matrix_output_ref;
|
||||||
|
extern arm_matrix_instance_f64 matrix_output_fut64;
|
||||||
|
extern arm_matrix_instance_f64 matrix_output_ref64;
|
||||||
|
extern MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_f32_fut[MATRIX_TEST_MAX_ELTS];
|
||||||
|
extern MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_f32_ref[MATRIX_TEST_MAX_ELTS];
|
||||||
|
extern MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_scratch[MATRIX_TEST_MAX_ELTS];
|
||||||
|
|
||||||
|
/* Matrix Inputs */
|
||||||
|
MATRIX_DECLARE_INPUTS(f64);
|
||||||
|
MATRIX_DECLARE_INPUTS(f32);
|
||||||
|
MATRIX_DECLARE_INPUTS(q31);
|
||||||
|
MATRIX_DECLARE_INPUTS(q15);
|
||||||
|
|
||||||
|
extern const float32_t matrix_f32_scale_values[MATRIX_MAX_COEFFS_LEN];
|
||||||
|
extern const q31_t matrix_q31_scale_values[MATRIX_MAX_COEFFS_LEN];
|
||||||
|
extern const q15_t matrix_q15_scale_values[MATRIX_MAX_COEFFS_LEN];
|
||||||
|
extern const int32_t matrix_shift_values[MATRIX_MAX_SHIFTS_LEN];
|
||||||
|
|
||||||
|
#endif /* _MATRIX_TEST_DATA_H_ */
|
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef _MATRIX_TEST_GROUP_H_
|
||||||
|
#define _MATRIX_TEST_GROUP_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Declare Test Groups */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
JTEST_DECLARE_GROUP(matrix_tests);
|
||||||
|
|
||||||
|
#endif /* _MATRIX_TEST_GROUP_H_ */
|
@ -0,0 +1,17 @@
|
|||||||
|
#ifndef _MATRIX_TESTS_H_
|
||||||
|
#define _MATRIX_TESTS_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Test/Group Declarations */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
JTEST_DECLARE_GROUP(mat_add_tests);
|
||||||
|
JTEST_DECLARE_GROUP(mat_cmplx_mult_tests);
|
||||||
|
JTEST_DECLARE_GROUP(mat_init_tests);
|
||||||
|
JTEST_DECLARE_GROUP(mat_inverse_tests);
|
||||||
|
JTEST_DECLARE_GROUP(mat_mult_tests);
|
||||||
|
JTEST_DECLARE_GROUP(mat_mult_fast_tests);
|
||||||
|
JTEST_DECLARE_GROUP(mat_sub_tests);
|
||||||
|
JTEST_DECLARE_GROUP(mat_trans_tests);
|
||||||
|
JTEST_DECLARE_GROUP(mat_scale_tests);
|
||||||
|
|
||||||
|
#endif /* _MATRIX_TESTS_H_ */
|
@ -0,0 +1,157 @@
|
|||||||
|
#ifndef _STATISTICS_TEMPLATES_H_
|
||||||
|
#define _STATISTICS_TEMPLATES_H_
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Includes */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "test_templates.h"
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Group Specific Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the outputs from the function under test and the reference function.
|
||||||
|
*/
|
||||||
|
#define STATISTICS_COMPARE_INTERFACE(block_size, \
|
||||||
|
output_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEST_ASSERT_BUFFERS_EQUAL( \
|
||||||
|
statistics_output_ref.data_ptr, \
|
||||||
|
statistics_output_fut.data_ptr, \
|
||||||
|
1 * sizeof(output_type) /* All fns return one value*/ \
|
||||||
|
); \
|
||||||
|
TEST_ASSERT_EQUAL( \
|
||||||
|
statistics_idx_fut, \
|
||||||
|
statistics_idx_ref); \
|
||||||
|
} while (0) \
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Comparison SNR thresholds for the data types used in statistics_tests.
|
||||||
|
*/
|
||||||
|
#define STATISTICS_SNR_THRESHOLD_float32_t 120
|
||||||
|
#define STATISTICS_SNR_THRESHOLD_q31_t 100
|
||||||
|
#define STATISTICS_SNR_THRESHOLD_q15_t 60
|
||||||
|
#define STATISTICS_SNR_THRESHOLD_q7_t 30
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare reference and fut outputs using SNR.
|
||||||
|
*
|
||||||
|
* @note The outputs are converted to float32_t before comparison.
|
||||||
|
*/
|
||||||
|
#define STATISTICS_SNR_COMPARE_INTERFACE(block_size, \
|
||||||
|
output_type) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TEST_CONVERT_AND_ASSERT_SNR( \
|
||||||
|
statistics_output_f32_ref, \
|
||||||
|
statistics_output_ref.data_ptr, \
|
||||||
|
statistics_output_f32_fut, \
|
||||||
|
statistics_output_fut.data_ptr, \
|
||||||
|
1, /* All fns return one element*/ \
|
||||||
|
output_type, \
|
||||||
|
STATISTICS_SNR_THRESHOLD_##output_type \
|
||||||
|
); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Input Interfaces */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/*
|
||||||
|
* General:
|
||||||
|
* Input interfaces provide inputs to functions inside test templates. They
|
||||||
|
* ONLY provide the inputs. The output variables should be hard coded.
|
||||||
|
*
|
||||||
|
* The input interfaces must have the following format:
|
||||||
|
*
|
||||||
|
* ARM_xxx_INPUT_INTERFACE() or
|
||||||
|
* REF_xxx_INPUT_INTERFACE()
|
||||||
|
*
|
||||||
|
* The xxx must be lowercase, and is intended to be the indentifying substring
|
||||||
|
* in the function's name. Acceptable values are 'sub' or 'add' from the
|
||||||
|
* functions arm_add_q31.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ARM_max_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, \
|
||||||
|
statistics_output_fut.data_ptr, &statistics_idx_fut)
|
||||||
|
|
||||||
|
#define REF_max_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, \
|
||||||
|
statistics_output_ref.data_ptr, &statistics_idx_ref)
|
||||||
|
|
||||||
|
#define ARM_mean_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, statistics_output_fut.data_ptr)
|
||||||
|
|
||||||
|
#define REF_mean_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, statistics_output_ref.data_ptr)
|
||||||
|
|
||||||
|
#define ARM_min_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, \
|
||||||
|
statistics_output_fut.data_ptr, &statistics_idx_fut)
|
||||||
|
|
||||||
|
#define REF_min_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, \
|
||||||
|
statistics_output_ref.data_ptr, &statistics_idx_ref)
|
||||||
|
|
||||||
|
#define ARM_power_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, statistics_output_fut.data_ptr)
|
||||||
|
|
||||||
|
#define REF_power_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, statistics_output_ref.data_ptr)
|
||||||
|
|
||||||
|
#define ARM_rms_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, statistics_output_fut.data_ptr)
|
||||||
|
|
||||||
|
#define REF_rms_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, statistics_output_ref.data_ptr)
|
||||||
|
|
||||||
|
#define ARM_std_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, statistics_output_fut.data_ptr)
|
||||||
|
|
||||||
|
#define REF_std_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, statistics_output_ref.data_ptr)
|
||||||
|
|
||||||
|
#define ARM_var_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, statistics_output_fut.data_ptr)
|
||||||
|
|
||||||
|
#define REF_var_INPUT_INTERFACE(input, block_size) \
|
||||||
|
PAREN(input, block_size, statistics_output_ref.data_ptr)
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
/* Test Templates */
|
||||||
|
/*--------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of #TEST_TEMPLATE_BUF1_BLK() for statistics tests.
|
||||||
|
*
|
||||||
|
* @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and
|
||||||
|
* REF_xxx_INPUT_INTERFACEs.
|
||||||
|
*/
|
||||||
|
#define STATISTICS_DEFINE_TEST_TEMPLATE_BUF1_BLK(fn_name, \
|
||||||
|
suffix, \
|
||||||
|
input_type, \
|
||||||
|
output_type, \
|
||||||
|
comparison_interface) \
|
||||||
|
JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \
|
||||||
|
arm_##fn_name##_##suffix) \
|
||||||
|
{ \
|
||||||
|
TEST_TEMPLATE_BUF1_BLK( \
|
||||||
|
statistics_f_all, \
|
||||||
|
statistics_block_sizes, \
|
||||||
|
input_type, \
|
||||||
|
output_type, \
|
||||||
|
arm_##fn_name##_##suffix, \
|
||||||
|
ARM_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
ref_##fn_name##_##suffix, \
|
||||||
|
REF_##fn_name##_INPUT_INTERFACE, \
|
||||||
|
comparison_interface); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _STATISTICS_TEMPLATES_H_ */
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user